使用Java AWS SDK的DynamoDbEnhancedClient如何实现复合键条件查询
你不需要单独拼接两个QueryConditional对象,DynamoDbEnhancedClient的QueryConditional静态方法本身就支持直接生成复合键条件,全程走索引查询,不会触发后置过滤,性能符合要求。
正确实现逻辑如下:
1. 直接构建复合键查询条件
QueryConditional的所有排序键相关方法,要求传入的Key对象同时包含分区键值+排序键值,会自动生成分区键相等 + 排序键对应条件的复合键表达式:
QueryConditional compositeConditional = QueryConditional.sortBetween( // 下限Key:指定分区值+排序键最小值 Key.builder() .partitionValue("myIdValue") .sortValue(0) .build(), // 上限Key:指定相同分区值+排序键最大值 Key.builder() .partitionValue("myIdValue") .sortValue(100) .build() );
2. 执行查询
直接把构建好的复合条件传入请求即可,如果是查询GSI,需要额外指定索引名:
dynamoDbEnhancedClient.table(myTableName, TableSchema.fromBean(TableObject.class)) .query(QueryEnhancedRequest.builder() .indexName("你的GSI名称") // 针对GSI查询必须指定索引名 .queryConditional(compositeConditional) .build()) .items();
补充说明
- 其他排序键条件的用法同理:比如要查指定分区下
count大于某个值的记录,直接用QueryConditional.sortGreaterThan(),传入包含分区值和排序键阈值的Key即可。 - 这种实现生成的原生键条件表达式和你预期的完全一致,会直接利用GSI的索引能力,不会用到
filterExpression的后置过滤逻辑,性能最优。
内容的提问来源于stack exchange,提问作者Brett Richards
相关产品推荐
相关产品推荐

