如何从DynamoDBMapper查询()的分页结果中检索所有项目?

时间:2012-05-29 17:58:28

标签: java amazon-web-services amazon-dynamodb

我试图在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”集合。也就是说,最初它只返回一页结果。它在需要时为下一页进行服务调用。

现在问题是,如何告诉映射器进行服务调用或需要页面,以便加载所有页面(实际上是所有条目)?

1 个答案:

答案 0 :(得分:9)

Amazon DynamoDBDynamoDBMapper Class文档中的Java代码段在这里有点不幸(虽然技术上是正确的),AWS SDK for JavaClass DynamoDBMapper API文档是(自然的) )在这方面更精确,见方法query()

public <T> PaginatedQueryList<T> query(Class<T> clazz,
                                       DynamoDBQueryExpression queryExpression)

因此返回的类型实际上是Class PaginatedQueryList

  

实现表示结果的List接口   AWS DynamoDB中的查询。 分页结果按需加载时   用户执行需要它们的操作。 一些操作,   比如size(),必须获取整个列表,但结果是懒惰的   尽可能逐页获取。 [强调我的]

也就是说,你真的不需要在正常使用期间显式加载任何东西,只要它由PaginatedQueryList<T>的延迟加载实现隐式处理;但是,如果出于某种原因需要,您可以通过需要访问整个集合的操作来触发它,明确提到的size()方法显然是其中之一。