0

嗨,我有一个 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);

}

我基本上有两个问题:

  1. 为什么它不能使用 KeyConditionExpression 而是使用第二种方法
  2. 如何在 DAX 中使用过滤器表达式?
4

0 回答 0