2012-05-29 1 views
8

Я пытаюсь запросить DynamoDB с помощью DynamoDBMapper в Java с как hashKey, так и rangeKey. Но я не получаю никаких результатов, он возвращает только часть его. Мой код выглядит следующим образом:Как получить все элементы из разбитого на страницу результата запроса DynamoDBMapper()?

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 говорит:

метод запрос возвращает «ленивую нагруженный» коллекцию. То есть сначала он возвращает только одну страницу результатов. При необходимости он выполняет вызов службы на следующей странице.

Теперь вопрос заключается в том, как рассказать картографу о выполнении служебного вызова или о необходимости создания страницы, чтобы она загружала все страницы (фактически все записи)?

ответ

9

фрагмент кода Java в Amazon DynamoDB документации для DynamoDBMapper Class немного неудачно здесь (хотя технологически правильно), документация AWS SDK for Java API для Class DynamoDBMapper (естественно) более точной в этой связи см метода query():

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

Так возвращаемый тип фактически Class PaginatedQueryList:

Реализация интерфейса List, который представляет результаты Фро m запрос в AWS DynamoDB. Результаты с разбивкой по страницам загружаются по требованию, когда пользователь выполняет требуемую операцию. Некоторые операции, , такие как size(), должны отображать весь список, но результаты лениво выбираются по страницам, если это возможно. [подчеркнуть мой]

То есть, вы действительно не нужно явно загружать что-либо во время обычного использования, поскольку она неявно позаботятся реализации отложенной погрузочной PaginatedQueryList<T>; однако, если это так по какой-либо причине, вы можете вызвать его посредством операций, требующих доступа ко всей коллекции, причем явно упомянутый метод size() является одним из них.

+0

Открыто, я согласен с вашим ответом. Похоже, я вхожу в ту же проблему. Вопрос здесь, https://stackoverflow.com/questions/45495145/issue-with-caching-and-dynamo-db-combination – Deepak