Cloud Spanner 结果集获取长度

Cloud Spanner ResultSet Get Length

我有如下一段代码:

static void query(DatabaseClient dbClient) {
  try (ResultSet resultSet =
      dbClient
          .singleUse() // Execute a single read or query against Cloud Spanner.
          .executeQuery(Statement.of("SELECT SingerId, AlbumId, AlbumTitle FROM Albums"))) {
    if (resultSet is of size 1) { do something }
    while (resultSet.next()) {
      System.out.printf(
          "%d %d %s\n", resultSet.getLong(0), resultSet.getLong(1), resultSet.getString(2));
    }
  }
}

问题: 我想使用查看 resultSet 的长度是否严格为 1。

尝试解决方案: resultSet.getStats().getRowCountExact() == 1

但是:

ResultSetStats getStats() returns the ResultSetStats for the query only if the query was executed in either the PLAN or the PROFILE mode via the ReadContext.analyzeQuery(Statement, com.google.cloud.spanner.ReadContext.QueryAnalyzeMode) method or for DML statements in ReadContext#executeQuery(Statement, QueryOption...).

我不确定如何在 PLAN 或 PROFILE 模式下执行查询,我的 Java 项目中是否有某种文件允许我声明它,或者 Cloud Spanner 上的设置?

如果有人有任何想法,我也愿意接受其他解决方案,但不确定这 4 种方法还能做什么(查看上面的 link)。

不幸的是,通过查看 ResultSet.

的统计数据无法实现您想要做的事情

您可以通过调用方法DatabaseClient#analyzeQuery(Statement, QueryAnalyzeMode)PROFILEPLAN模式执行查询。根据您的示例,这看起来像这样:

static void query(DatabaseClient dbClient) {
  try (ResultSet resultSet =
      dbClient
          .singleUse() // Execute a single read or query against Cloud Spanner.
          .analyzeQuery(Statement.of("SELECT SingerId, AlbumId, AlbumTitle FROM Albums", QueryAnalyzeMode.PROFILE))) {
    while (resultSet.next()) {
      System.out.printf(
          "%d %d %s\n", resultSet.getLong(0), resultSet.getLong(1), resultSet.getString(2));
    }
  }
}

但是:结果集的统计信息只有在您使用了整个结果集后才可用(即一旦 ResultSet#next() 方法返回 false)。所以你不能在消费它之前做检查'what is the number of records in the result set'。

实现您要执行的操作的最佳方法是先执行 SELECT COUNT(*) FROM ... 查询,然后根据该查询确定是否还要执行第二个查询。