我有一个名为“product”的 DynamoDB 表,其全局二级索引位于“userId”上。主键位于“id”上。
我正在尝试使用“userID”GSI 上的“withExclusiveStartKey”来实现分页查询。
但是,当我传递有效的 LastId 时,出现以下异常:
独占开始键必须与表的键架构具有相同的大小
(服务:AmazonDynamoDBv2;状态代码:400;错误代码:
验证异常;请求ID:
822db97e-04a3-4c36-8c72-6008e2693679)
我在这里做错了什么?
public QueryResultPage<Product> findPaged(String userId,int limit,String lastId) {
DynamoDBMapper mapper = new DynamoDBMapper(dynamoDb);
Map<String, AttributeValue> vals = new HashMap<>();
vals.put(":valUserId", new AttributeValue().withS(userId));
DynamoDBQueryExpression<Product> queryExp = new DynamoDBQueryExpression<Product>()
.withKeyConditionExpression("userId = :valUserId")
.withIndexName(ModelConsts.TBL_PRODUCT_GSI_USERID)
.withExpressionAttributeValues(vals)
.withScanIndexForward(false)
.withConsistentRead(false)
.withLimit(limit);
if (lastId != null) {//paging
Map<String, AttributeValue> exclusiveStartKey = new HashMap<String, AttributeValue>();
exclusiveStartKey.put("id", new AttributeValue().withS(lastId));
queryExp = queryExp.withExclusiveStartKey(exclusiveStartKey);
}
QueryResultPage<Product> result = mapper.queryPage(Product.class, queryExp);
return result;
}
我正在为那些试图构建exclusiveStartKey
manually,用于 GSI 查询。看来专属启动键由 3 个部分组成:
这似乎没有记录在任何地方,因为您应该只使用返回的lastEvaluatedKey
通过致电:
setLastEvaluatedKey(queryResult.getLastEvaluatedKey());
接受的答案是正确的,但它给读者留下的印象是密钥只有两个组件,这对我的情况没有帮助。
这里描述的解决方案首先在这个 GitHub 问题 https://github.com/stevearc/flywheel/issues/34#issuecomment-165520416.
以下是使用 AWS Java SDK v2 实现上述内容的方法:
QueryRequest.Builder queryBuilder = QueryRequest.builder();
Map<String, AttributeValue> startKey = new HashMap<>(3);
// HASH/PARTITION KEY
startKey.put("gsiHashKeyAttribute", AttributeValue.builder().s(gsiHashKey).build());
// RANGE/SORT KEY
startKey.put("gsiRangeKeyAttribute", AttributeValue.builder().s(gsiRangeKey).build());
// TABLE PRIMARY KEY
startKey.put("tablePrimaryKeyAttribute", AttributeValue.builder().s(tablePrimaryKey).build());
queryBuilder.exclusiveStartKey(startKey);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)