我试图在Java的DynamoDBMapper的帮助下使用hashKey和rangeKey来查询DynamoDB。但我没有得到所有结果,它只返回它的一部分。我的代码如下:
queryDynamoDb() {
Condition rangeKeyCondition = new Condition()
.withComparisonOperator(ComparisonOperator.GT.toString())
.withAttributeValueList(new AttributeValue().withS("0"));
DynamoDBQueryExpression queryExpression = new DynamoDBQueryExpression(
new AttributeValue().withS(prefKey));
queryExpression.setRangeKeyCondition(rangeKeyCondition);
List<MyObj> myobjs = mapper.query(MyObj.class, queryExpression);
return myobjs;
}
使用DynamoDB注释正确注释了 MyObj
。所以我能够保存对象,但检索只返回部分结果。
DynamoDBMapper中查询的文档说:
查询方法返回“lazy-loaded”集合。也就是说,最初它只返回一页结果。它在需要时为下一页进行服务调用。
现在问题是,如何告诉映射器进行服务调用或需要页面,以便加载所有页面(实际上是所有条目)?
答案 0 :(得分:9)
Amazon DynamoDB的DynamoDBMapper Class文档中的Java代码段在这里有点不幸(虽然技术上是正确的),AWS SDK for Java的Class DynamoDBMapper API文档是(自然的) )在这方面更精确,见方法query():
public <T> PaginatedQueryList<T> query(Class<T> clazz,
DynamoDBQueryExpression queryExpression)
因此返回的类型实际上是Class PaginatedQueryList:
实现表示结果的List接口 AWS DynamoDB中的查询。 分页结果按需加载时 用户执行需要它们的操作。 一些操作, 比如size(),必须获取整个列表,但结果是懒惰的 尽可能逐页获取。 [强调我的]
也就是说,你真的不需要在正常使用期间显式加载任何东西,只要它由PaginatedQueryList<T>
的延迟加载实现隐式处理;但是,如果出于某种原因需要,您可以通过需要访问整个集合的操作来触发它,明确提到的size()方法显然是其中之一。