如何用LSI和mapper查询dynamodb

时间:2016-08-24 01:52:51

标签: java amazon-dynamodb aws-sdk

我目前正在尝试使用LSI和dynamoDB映射器类从发电机数据库表加载信息。假设我有以下代码

Conisder this class

class Employee {
    @DynamoDBHashKey
    public String getID() {
        return ID;
    }
    @DynamoDBRangeKey
    public String getFirstName() {
        return firstName;
    }

    @DynamoDBIndexRangeKey(localSecondaryIndexName = "my-lsi")
    public String getLastName() {
    return lastName;
    }

    public String getMyotherfield() {
    return myotherfield;
    }
}

考虑使用LSI和dynamoDB映射器检索信息的这段代码

Employee obj = new Employee();
obj.setID("221");
obj.setLastName("SOMEONE");
DynamoDBQueryExpression<Employee> queryExpression = new DynamoDBQueryExpression<>();
queryExpression.setHashKeyValues(obj);
queryExpression.setIndexName("my-lsi");
queryExpression.setProjectionExpression("myotherfield");

PaginatedQueryList<Employee> paginatedQueryList = mapper.query(Employee.class, queryExpression);
Iterator<Employee> iterator = paginatedQueryList.iterator();
while (iterator.hasNext()) {
    Employee pp = iterator.next();
    // some code
}

[编辑] 这是使用映射器查询LSI的正确方法吗? 如果不是什么是使用LSI和dynamoDBMapper从表中获取数据的更好方法? (在表现方面)

我也发现了这个https://java.awsblog.com/post/Tx3GYZEVGO924K4/The-DynamoDBMapper-Local-Secondary-Indexes-and-You但它是2013年的一个链接。我无法找到有关使用LSI和映射器查询的最新文档。

1 个答案:

答案 0 :(得分:2)

请注意,在您提供的代码中,您根本没有设置范围键。使用queryExpression.setRangeKeyConditions()即可。

以下是代码示例:

Map<String, Condition> rangeKeyConditions = new HashMap<>();
rangeKeyConditions.put("lastName", new Condition()
                 .withComparisonOperator(ComparisonOperator.EQ)
                .withAttributeValueList(new AttributeValue().withS("SOMEONE")));
queryExpression.setRangeKeyConditions(rangeKeyConditions);`

[更新]:

在对象(obj)中设置范围键值(“SOMEONE”)是不够的(也没有必要),因为该对象仅用于设置hashKey。看看示例here