DynamoDB Mapper查询不支持QueryExpression限制

时间:2017-05-18 22:52:08

标签: amazon-dynamodb

想象一下以下函数,它查询GlobalSecondaryIndex和相关的Range Key,以便找到有限数量的结果:

@Override
public List<Statement> getAllStatementsOlderThan(String userId, String startingDate, int limit) {

    if(StringUtils.isNullOrEmpty(startingDate)) {
        startingDate = UTC.now().toString();
    }

    LOG.info("Attempting to find all Statements older than ({})", startingDate);

    Map<String, AttributeValue> eav = Maps.newHashMap();
    eav.put(":userId", new AttributeValue().withS(userId));
    eav.put(":receivedDate", new AttributeValue().withS(startingDate));

    DynamoDBQueryExpression<Statement> queryExpression = new DynamoDBQueryExpression<Statement>()
            .withKeyConditionExpression("userId = :userId and receivedDate < :receivedDate").withExpressionAttributeValues(eav)
            .withIndexName("userId-index")
            .withConsistentRead(false);

    if(limit > 0) {
        queryExpression.setLimit(limit);
    }

    List<Statement> statementResults = mapper.query(Statement.class, queryExpression);

    LOG.info("Successfully retrieved ({}) values", statementResults.size());

    return statementResults;
}

List<Statement> results = statementRepository.getAllStatementsOlderThan(userId, UTC.now().toString(), 5);

assertThat(results.size()).isEqualTo(5); // NEVER passes

每当我查询数据库时,都不会遵守限制。我总是收到符合我的搜索条件的所有结果,因此,如果我将startingDate设置为now,那么我会获得数据库中的所有项目,因为它们都比now更早。

1 个答案:

答案 0 :(得分:1)

您应该使用queryPage功能代替query

来自DynamoDBQueryExpression.setLimit文档:

  

设置每个服务请求中要检索的最大项目数   到DynamoDB。

     

注意调用DynamoDBMapper.query时,多个   如果需要检索整个结果,则会向DynamoDB发出请求   组。设置此项将限制每个项检索的项目数   请求,而不是将检索的结果总数。使用   DynamoDBMapper.queryPage从中检索单页的项目   DynamoDB。