首页 > 解决方案 > 如何在 java 中通过哈希和范围键查询 DynamoDB?

问题描述

我是相当新的DynamoDBsdk。我真的不知道如何使用 hashKey 和 rangeKey 在 DynamoDB 中的表中进行查询。

表架构:

1. Id (HK)
2. Book (GSI HK)
3. User (GSI RK)

我正在使用全局二级索引GSI: bookAndUserIndex。代码片段:

    public Loan getByBookAndUser(String book, String user) {
        Loan loan = null;
        HashMap<String, AttributeValue> av = new HashMap<>();
        av.put(":v1", new AttributeValue().withS(book));
        DynamoDBQueryExpression<Loan> queryExp = new DynamoDBQueryExpression<Loan>()
                .withIndexName("bookAndUserIndex")
                .withKeyConditionExpression("book = :v1")
                .withExpressionAttributeValues(av)
                .withConsistentRead(false);
        PaginatedQueryList<Loan> result = this.mapper.query(Loan.class, queryExp);
        if (result.size() > 0) {
            loan = result.get(0);
        }
        return loan;
    }

如何编辑此代码以过滤/获取user

标签: javaamazon-web-servicesamazon-dynamodb

解决方案


您只需将范围(排序)键添加到表达式中:

   public Loan getByBookAndUser(String book, String user) {
        Loan loan = null;
        HashMap<String, AttributeValue> av = new HashMap<>();
        av.put(":v1", new AttributeValue().withS(book));
        av.put(":user", new AttributeValue().withS(user));
        DynamoDBQueryExpression<Loan> queryExp = new DynamoDBQueryExpression<Loan>()
                .withIndexName("bookAndUserIndex")
                .addExpressionAttributeNamesEntry("#user", "user")
                .withKeyConditionExpression("book = :v1 AND #user = :user")
                .withExpressionAttributeValues(av)
                .withConsistentRead(false);
        PaginatedQueryList<Loan> result = this.mapper.query(Loan.class, queryExp);
        if (result.size() > 0) {
            loan = result.get(0);
        }
        return loan;
    }

这在AWS SDK for Java 文档中有详细记录。


推荐阅读