GridDB 如何像 SQL 的 LIMIT 一样限制查询结果数量?
可以。在 GridDB 的 Java API 中,先调用 query.setFetchOption(FetchOption.LIMIT, 100),再执行 fetch(),即可将查询结果限制为最多 100 行。也可以直接在 GridDB 的 TQL 中使用 LIMIT 100。
使用 Java API 限制返回行数
在现有代码的 fetch() 前增加一行:
query.setFetchOption(FetchOption.LIMIT, 100);
完整的查询流程如下:
import com.toshiba.mwcloud.gs.FetchOption;
import com.toshiba.mwcloud.gs.Query;
import com.toshiba.mwcloud.gs.RowSet;
// 假设 container 已打开,SensorData 已定义。
// 所在方法需要捕获或声明抛出 GSException。
try (Query<SensorData> query = container.query(
"SELECT * FROM sensor_data WHERE deviceId = 'device_1'")) {
query.setFetchOption(FetchOption.LIMIT, 100);
try (RowSet<SensorData> rs = query.fetch()) {
while (rs.hasNext()) {
SensorData row = rs.next();
// 处理这一行数据
}
}
}
FetchOption.LIMIT 设置结果行数的上限。匹配记录超过 100 行时,从该 RowSet 中最多只能取得前 100 行;不足 100 行时,返回实际匹配的行数。参数支持 Integer 和 Long,可以使用 100 或 100L,但不能传入负数。具体定义见 GridDB Java API 文档。
直接在 TQL 中使用 LIMIT
container.query(...) 接收的是 TQL。TQL 与 SQL 的支持范围有所不同,也支持 LIMIT 子句:
try (Query<SensorData> query = container.query(
"SELECT * FROM sensor_data " +
"WHERE deviceId = 'device_1' LIMIT 100");
RowSet<SensorData> rs = query.fetch()) {
while (rs.hasNext()) {
SensorData row = rs.next();
// 处理这一行数据
}
}
这个查询使用 API 选项或 TQL 子句中的一种即可,无须重复设置。TQL 还支持 LIMIT 100 OFFSET 100,表示跳过前 100 行后,最多返回 100 行。语法见 TQL 官方参考。
“前 100 行”需要明确排序
如果只需要任意一批匹配记录,设置数量上限即可。要读取时间最早或最新的 100 行,则需要加入 ORDER BY。
假设容器中有名为 timestamp 的时间列,读取最新的 100 行可以写成:
SELECT * FROM sensor_data
WHERE deviceId = 'device_1'
ORDER BY timestamp DESC
LIMIT 100
TQL 支持按多个列排序。如果时间值可能重复,且需要确定这些记录之间的先后顺序,应再加入能区分记录的排序列。相关规则见 TQL 排序说明。
使用时注意
在 Java 循环中读满 100 行后执行 break,只能控制应用处理的行数,不能替代查询结果的数量限制。行数上限应在执行查询前设置。
返回最多 100 行,也不代表数据库只扫描 100 行。筛选条件、索引和排序都会影响查询开销,不能仅凭 LIMIT 100 推断查询耗时。
备注:内容仅供参考。
