[英]Get a list of items (like a SQL IN clause)
我有一个项目表,其中每个项目都属于一个组织。 每个项目都有一个名称和一个自动生成的UUID。 该项目的名称在组织内应唯一。 因此,我将表定义如下:
{
"AttributeDefinitions": [
{ "AttributeName": "orgId", "AttributeType": "S" },
{ "AttributeName": "name", "AttributeType": "S" },
{ "AttributeName": "id", "AttributeType": "S" }
],
"TableName": "symbols",
"KeySchema": [
{ "AttributeName": "orgId", "KeyType": "HASH" },
{ "AttributeName": "name", "KeyType": "RANGE" }
],
"LocalSecondaryIndexes": [
{
"IndexName": "IdIndex",
"KeySchema": [
{ "AttributeName": "orgId", "KeyType": "HASH" },
{ "AttributeName": "id", "KeyType": "RANGE" }
],
"Projection": {
"ProjectionType": "KEYS_ONLY"
}
}
],
"ProvisionedThroughput": {
"ReadCapacityUnits": 10,
"WriteCapacityUnits": 5
},
"SSESpecification": {
"Enabled": true
}
}
我正在尝试检索与指定ID列表匹配的项目集。 我的Java代码如下所示:
List<AttributeValue> attributeValueList = new ArrayList<>();
String[] idList = {"d329e1f8-9705-4ec2-95a9-135379e32090", "ddcc98e9-9a55-4c2c-b329-ed696b1bcc5c"};
for (String id : idList) {
attributeValueList.add(new AttributeValue().withS(id));
}
HashMap<String, Condition> keyConditions = new HashMap<>();
keyConditions.put("orgId", new Condition()
.withComparisonOperator(ComparisonOperator.EQ)
.withAttributeValueList(new AttributeValue("111")));
keyConditions.put("id", new Condition()
.withComparisonOperator(ComparisonOperator.IN)
.withAttributeValueList(attributeValueList));
QueryRequest queryRequest = new QueryRequest()
.withTableName(Symbol.TABLE_SYMBOL)
.withKeyConditions(keyConditions)
.withIndexName("IdIndex")
.withSelect("ALL_ATTRIBUTES");
QueryResult queryResult = dynamoDB.query(queryRequest);
当我运行查询时,它给了我一个例外:
尝试的条件约束不是可索引的操作
有什么想法为什么不起作用? 我是否需要使用扫描? 如果可能的话,我想坚持查询。
对于任何尝试做类似事情的人,这都是有效的。
List<AttributeValue> attributeValueList = new ArrayList<>();
for (String id : objectIds) {
attributeValueList.add(new AttributeValue().withS(id));
}
TextFragment partitionKey = new TextFragment();
partitionKey.setOrgId(user.getOrgId());
Condition rangeKeyCondition = new Condition();
rangeKeyCondition.withComparisonOperator(ComparisonOperator.IN)
.withAttributeValueList(attributeValueList);
DynamoDBQueryExpression<TextFragment> queryExpression = new DynamoDBQueryExpression<TextFragment>()
.withHashKeyValues(partitionKey)
.withQueryFilterEntry("id", rangeKeyCondition);
List<TextFragment> itemList = mapper.query(TextFragment.class, queryExpression);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.