DynamoDB中QuerySpec查询的分页是否已实现?需手动编码吗?
问题解答
这段代码没有实现完整的分页获取所有数据的功能,你需要添加额外编码来遍历DynamoDB的所有分页结果。
原因说明
DynamoDB的query操作默认仅返回单页数据(上限为1MB或你设置的limit值)。当查询结果超过单页容量时,返回的QueryOutcome会包含LastEvaluatedKey,标记下一页数据的起始位置。你当前的代码只获取了第一页数据,没有处理后续分页。
修改后的代码示例
要获取所有分页数据,需要循环查询直到LastEvaluatedKey为null,示例代码如下:
QuerySpec querySpec = new QuerySpec() .withKeyConditionExpression(CONSTANT_DYNAMO_KEY_EXPRESSION) .withNameMap(map) .withValueMap( new ValueMap().withString(CONSTANT_DYNAMO_TARGET_TENANT_TYPE, targetTenantType)) .withProjectionExpression(CONSTANT_DYNAMO_KEY_TENANT_ID); Map<String, AttributeValue> lastEvaluatedKey = null; do { // 设置下一页的起始键(如果存在) if (lastEvaluatedKey != null) { querySpec.withExclusiveStartKey(lastEvaluatedKey); } // 执行查询 ItemCollection<QueryOutcome> items = table.getIndex(CONSTANT_DYNAMO_INDEX).query(querySpec); Iterator<Item> iterator = items.iterator(); // 遍历当前页数据 while (iterator.hasNext()) { Item item = iterator.next(); String tenantName = item.getString("str_1"); System.out.println(tenantName); } // 获取下一页的起始键 lastEvaluatedKey = items.getLastLowLevelResult().getQueryResult().getLastEvaluatedKey(); } while (lastEvaluatedKey != null);
额外注意点
- 原代码中的
while (iterator != null & iterator.hasNext())使用了按位与&,建议改为短路与&&,避免潜在的空指针风险(虽然items.iterator()返回的迭代器不会为null,但这是更规范的写法)。 - 如果查询结果量极大,需注意循环次数和请求频率,避免触发DynamoDB的请求速率限制。
内容的提问来源于stack exchange,提问作者Rishita Raj
相关产品推荐
相关产品推荐

