我目前正在尝试使用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和映射器查询的最新文档。
答案 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