amazon-web-services - 查询表达式非法:在AWS Query的查询中未找到哈希键条件

标签 amazon-web-services amazon-dynamodb

我在AWS移动中心中有表格,并且正在使用以下模型

public class UserstopcoreDO {
    private String _userId;
    private String _usertoplevel;
    private String _usertopscore;
    private String _username;

    @DynamoDBHashKey(attributeName = "userId")
    @DynamoDBAttribute(attributeName = "userId")
    public String getUserId() {
        return _userId;
    }

    public void setUserId(final String _userId) {
        this._userId = _userId;
    }

    @DynamoDBAttribute(attributeName = "usertoplevel")
    public String getUsertoplevel() {
        return _usertoplevel;
    }

    @DynamoDBAttribute(attributeName = "username")
    public String getUsername() {
        return _username;
    }

    public void setUsername(final String _username) {
        this._username = _username;
    }

    public void setUsertoplevel(final String _usertoplevel) {
        this._usertoplevel = _usertoplevel;
    }

    @DynamoDBIndexHashKey(attributeName = "usertopscore", globalSecondaryIndexName = "usertopscore")
    public String getUsertopscore() {
        return _usertopscore;
    }

    public void setUsertopscore(final String _usertopscore) {
        this._usertopscore = _usertopscore;
    }

}


在表中,我有1500多个记录,现在我想从中获取前10条记录,为此,我编写了以下查询

final DynamoDBQueryExpression<UserstopcoreDO> queryExpression = new DynamoDBQueryExpression<>();
            queryExpression.withLimit(10);
            queryExpression.setScanIndexForward(false);
            final PaginatedQueryList<UserstopcoreDO> results = mapper.query(UserstopcoreDO.class, queryExpression);
            Iterator<UserstopcoreDO> resultsIterator = results.iterator();
            if (resultsIterator.hasNext()) {
                final UserstopcoreDO item = resultsIterator.next();
                try {
                    Log.d("Item :",item.getUsertopscore());
                } catch (final AmazonClientException ex) {
                    Log.e(LOG_TAG, "Failed deleting item : " + ex.getMessage(), ex);
                }
            }


但是当我运行代码时,它给了我一个错误

Caused by: java.lang.IllegalArgumentException: Illegal query expression: No hash key condition is found in the query


但在我的情况下,我不需要任何条件,因为我想获取前10条记录而不是一条特定记录。那么如何处理这种情况呢?

最佳答案

请在查询表达式中设置哈希键。以下是主表和GSI(需要设置索引名称)的查询表达式示例。

查询主表:

设置表的哈希键值。

UserstopcoreDO hashKeyObject = new UserstopcoreDO();
hashKeyObject.setUserId("1");

DynamoDBQueryExpression<UserstopcoreDO> queryExpressionForMainTable = new DynamoDBQueryExpression<UserstopcoreDO>()
    .withHashKeyValues(hashKeyObject);


查询索引:

设置索引名称和索引的哈希键值。

UserstopcoreDO hashIndexKeyObject = new UserstopcoreDO();
    hashIndexKeyObject.setUsertoplevel("100");

DynamoDBQueryExpression<UserstopcoreDO> queryExpressionForGsi = new DynamoDBQueryExpression<UserstopcoreDO>()
            .withHashKeyValues(hashIndexKeyObject).withIndexName("usertopscore");


映射器中的GSI属性:-

@DynamoDBIndexHashKey(attributeName = "usertoplevel",  globalSecondaryIndexName = "usertopscore")
public String getUsertoplevel() {
    return _usertoplevel;
}

@DynamoDBIndexRangeKey(attributeName = "usertopscore", globalSecondaryIndexName = "usertopscore")
public String getUsertopscore() {
    return _usertopscore;
}

关于amazon-web-services - 查询表达式非法:在AWS Query的查询中未找到哈希键条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46068539/

相关文章:

java - AWS DynamoDB 选择日期范围的查询

amazon-dynamodb - 当GetItem结果为空时,Dynamodb的AWS DAX会缓存空结果吗?

python - 如何将EC2 ip地址动态添加到Django ALLOWED_HOSTS

mysql - 无法从 Docker 容器连接到 Amazon RDS

ruby-on-rails - Rails s3 桶 SSL

javascript - NodeJS 结合异步函数的输出

python - 使用 DynamoDB transact_write_items 如何使用复合主键更新表的多个项目?

javascript - Cognito 不会将未经身份验证的用户切换为经过身份验证的用户

node.js - 在 node.js 中的 AWS lambda 函数之间共享代码

java - 使用 DynamoDBMapper 保存具有版本化属性的新项目