10

我正在尝试在 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;
}

MyObj使用 DynamoDB 注释正确注释。所以我能够保存对象,但检索只返回部分结果。

DynamoDBMapper中的查询文档说:

查询方法返回“延迟加载”集合。也就是说,最初它只返回一页结果。它会在需要时对下一页进行服务调用。

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

4

1 回答 1

11

DynamoDBMapper 类的Amazon DynamoDB文档中的 Java 代码片段在这里有点不幸(尽管在技术上是正确的),用于 DynamoDBMapper 类的AWS SDK for Java API 文档在这方面(自然)更精确,请参阅方法query()

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

所以返回的类型实际上是一个Class PaginatedQueryList

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

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

于 2012-05-29T21:19:53.070 回答