将dynamoDB表属性作为排序键进行搜索

时间:2016-06-15 17:41:06

标签: java amazon-dynamodb

我有一个定义如下的DynamoDB表:

UUId,itemName,itemOwner
1,item1,owner1
2,item1,owner2

我在这个表上有2个全局二级索引 name_index - > ITEMNAME(PartitionKey) owner_index - > itemOwner(PartitionKey),ItemName(SortKey)

我已经注释了dynamoDB Item类,如下所示:

@DynamoDBAttribute
@DynameDBIndexHashKey(globalSecondaryIndexName = "name_index")
@DynameDBIndexRangeKey(globalSecondaryIndexName = "owner_index")
private String itemName;


@DynamoDBAttribute
@DynameDBIndexHashKey(globalSecondaryIndexName = "owner_index")
private String itemOwner;

但是,当我尝试通过项目所有者查询表时,它无法返回任何内容。

Item itemKey = new ItemName();
itemKey.setItemOwner("owner1");
itemKey.setItemName("item1");
DynamoDBQueryExpression<T> expr = DynamoDBQueryExpression<T>().withIndexName("owner_index").withHashKeyValues(itemKey).withConsistentRead(false);
return mapper.query(ItemKey.class, expr);

然后我尝试将查询更改为设置范围键:

Item itemKey = new ItemName();
itemKey.setItemOwner("owner1");
List<AttributeValue> valueList = new LinkedList<>();
AttributeValue nameVal = new AttributeValue();
nameVal.setS("item1");
valueList.add(nameVal);
Condition con = new condition();
con.setComparisonOperator(ComparisonOperator.EQ);
con.setAttributeValueList(valueList);
DynamoDBQueryExpression<T> expr = DynamoDBQueryExpression<T>().withIndexName("owner_index").withHashKeyValues(itemKey).withRangeKeyCondtion("itemName", condition).withConsistentRead(false);
return mapper.query(ItemKey.class, expr);

这也没有任何回报。如果我通过控制台进行查询,但owner_index的值为ownername,则会返回正确的记录。

我的查询排序键出错了什么?

1 个答案:

答案 0 :(得分:0)

问题:

没有返回数据是我在查询改变数据之前运行其他测试代码的问题。修复数据和代码后,两个选项都有效。但是,第一个查询代码段不按排序键进行搜索,而是仅通过哈希键列itemOwner进行搜索,并返回所有值。

更正查询代码:

Item itemKey = new ItemName();
itemKey.setItemOwner("owner1");
List<AttributeValue> valueList = new LinkedList<>();
AttributeValue nameVal = new AttributeValue();
nameVal.setS("item1");
valueList.add(nameVal);
Condition con = new condition();
con.setComparisonOperator(ComparisonOperator.EQ);
con.setAttributeValueList(valueList);
DynamoDBQueryExpression<T> expr = DynamoDBQueryExpression<T>().withIndexName("owner_index").withHashKeyValues(itemKey).withRangeKeyCondtion("itemName", condition).withConsistentRead(false);
return mapper.query(ItemKey.class, expr);

正确注释:

@DynamoDBAttribute
@DynameDBIndexHashKey(globalSecondaryIndexName = "name_index")
@DynameDBIndexRangeKey(globalSecondaryIndexName = "owner_index")
private String itemName;


@DynamoDBAttribute
@DynameDBIndexHashKey(globalSecondaryIndexName = "owner_index")
private String itemOwner