嗨,我有一个 dynamo db 表,格式如下
@Data
@NoArgsConstructor
@AllArgsConstructor
@DynamoDbTable(tableName="transaction")
public class Transaction {
@DynamoDbHashKey
private String transId;
@DynamoDbIndexHashKey(globalSecondaryIndexName="userId-productCode-index")
private String userId;
@DynamoDbIndexRangeKey(globalSecondaryIndexName="userId-productCode-index")
private String productCode;
private String transactionStatus;
private String createDate;
}
我正在使用 DAX 集群来写入和读取数据。我正在使用映射器写入 DAX。
问题
我的问题是我无法使用 KeyConditionExpression 来查询数据。使用以下表达式查询时返回 0 个项目。
方法一
private List<TransactionItem> queryCurrentTransactionByStatus(TransactionItem item) {
mapper.save(item);
}
private List<TransactionItem> queryCurrentTransactionByStatus(TransactionItem item) {
Map<String, AttributeValue> eav = new HashMap<>();
eav.put(":v_uid", new AttributeValue().withS(item.getUserId()));
eav.put(":v_pcode", new AttributeValue().withS(item.getProductCode()));
eav.put(":v_status", new AttributeValue().withS(item.getTransactionStatus()));
DynamoDbQueryExpression<TransactionItem> query = new DynamoDbQueryExpression<TransactionItem>();
query
.withIndexName("userId-productCode-index")
.withConsistentRead(false)
.withKeyConditionExpression("userId = :v_uid and productCode=:v_pcode")
.withFilterExpression("transactionStatus = :v_status")
.withExpressionAttributeValues(eav)
List<TransactionItem> items = mapper.query(TransactionItem.class, query);
}
使用此查询时,我得到 0 个项目。虽然我可以在 dynamoDb 中看到该项目。
当使用下面的代码时,它也可以正常工作。(还检查了指标,它正确地使用 DAX 来查询项目,我能够使用下面的方法在查询中获取项目)。
方法二
private List<TransactionItem> queryCurrentTransactionByStatus(TransactionItem item) {
Condition rangeCondition = new Condition()
.withComparisonOperator(ComparisonOperator.EQ.toString())
.withAttributeValueList(new AttributeValue().withS(item.getProductCode()));
DynamoDbQueryExpression<TransactionItem> query = new DynamoDbQueryExpression<TransactionItem>();
query
.withIndexName("userId-productCode-index")
.withConsistentRead(false)
.withHashKeyValues(TransactionItem.builder().userId(item.getUserId()).build())
.withRangeKeyCondition("productCode", rangeCondition)
List<TransactionItem> items = mapper.query(TransactionItem.class, query);
}
但是仍然使用以下方法我无法使用过滤器表达式。
private List<TransactionItem> queryCurrentTransactionByStatus(TransactionItem item) {
Condition rangeCondition = new Condition()
.withComparisonOperator(ComparisonOperator.EQ.toString())
.withAttributeValueList(new AttributeValue().withS(item.getProductCode()));
DynamoDbQueryExpression<TransactionItem> query = new DynamoDbQueryExpression<TransactionItem>();
query
.withIndexName("userId-productCode-index")
.withConsistentRead(false)
.withHashKeyValues(TransactionItem.builder().userId(item.getUserId()).build())
.withRangeKeyCondition("productCode", rangeCondition)
.withFilterExpression("transactionStatus = :v_status")
.withExpressionAttributeValues(eav)
List<TransactionItem> items = mapper.query(TransactionItem.class, query);
}
我基本上有两个问题:
- 为什么它不能使用 KeyConditionExpression 而是使用第二种方法
- 如何在 DAX 中使用过滤器表达式?