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
但是:
我不确定如何在 PLAN 或 PROFILE 模式下执行查询,我的 Java 项目中是否有某种文件允许我声明它,或者 Cloud Spanner 上的设置?
如果有人有任何想法,我也愿意接受其他解决方案,但不确定这 4 种方法还能做什么(查看上面的 link)。
不幸的是,通过查看 ResultSet
.
的统计数据无法实现您想要做的事情
您可以通过调用方法DatabaseClient#analyzeQuery(Statement, QueryAnalyzeMode)
以PROFILE
或PLAN
模式执行查询。根据您的示例,这看起来像这样:
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 ...
查询,然后根据该查询确定是否还要执行第二个查询。
我有如下一段代码:
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
但是:
我不确定如何在 PLAN 或 PROFILE 模式下执行查询,我的 Java 项目中是否有某种文件允许我声明它,或者 Cloud Spanner 上的设置?
如果有人有任何想法,我也愿意接受其他解决方案,但不确定这 4 种方法还能做什么(查看上面的 link)。
不幸的是,通过查看 ResultSet
.
您可以通过调用方法DatabaseClient#analyzeQuery(Statement, QueryAnalyzeMode)
以PROFILE
或PLAN
模式执行查询。根据您的示例,这看起来像这样:
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 ...
查询,然后根据该查询确定是否还要执行第二个查询。