如何使用DynamoDBMapper查询具有仅哈希键的GSI的Dynamo DB?

24

我对Dynamo DB非常陌生,也许这是一个非常琐碎的问题,但是我已经查阅了Dynamo DB的文档和堆栈溢出的问题,但我找不到任何链接告诉我如何查询只有哈希键而没有指定范围键的GSI

我收到了异常消息:“非法查询表达式:在查询中未找到哈希键条件。”


只是为了明确起见,全局二级索引仅由HashKey组成,没有范围键,我如何使用DynamoDBMapper生成查询? - Ankit Banerjee
1个回答

47

在您的DynamoDB注解模型对象上,应使用@DynamoDBIndexHashKey(globalSecondaryIndexName = "gsiIndexName)表示它是GSI的哈希键:

@DynamoDBTable(tableName = "myTable")
public class MyTable {
    ...

    @DynamoDBIndexHashKey(globalSecondaryIndexName = "myGsi")
    public String getGsiHk() {
        return gsiHk;
    }

    ...
}

然后在DynamoDBMapper上使用query方法:

final MyTable gsiKeyObj = new MyTable();
gsiKeyObj.setGsiHk("myGsiHkValue");
final DynamoDBQueryExpression<MyTable> queryExpression = 
    new DynamoDBQueryExpression<>();
queryExpression.setHashKeyValues(gsiKeyObj);
queryExpression.setIndexName("myGsi");
queryExpression.setConsistentRead(false);   // cannot use consistent read on GSI
final PaginatedQueryList<MyTable> results = 
    mapper.query(MyTable.class, queryExpression);

嗨,@DynamoDBIndexRangeKey 怎么样?它给我带来了与 IndexRangeKey 相同的问题。 - Jignesh Ansodariya
嗨 @mkobit:你发送的代码完美运行,但是当我添加queryExpression.withLimit(10)时,它会出现以下错误:无法评估表达式Method threw 'android.os.NetworkOnMainThreadException' exception。我正在使用RxAndroid进行网络操作。 - Shaw
@Shaw 我不熟悉 Android 的具体情况,但我猜测你不能在主 UI 线程上进行阻塞调用 - 请参见 https://dev59.com/-mw15IYBdhLWcg3w3vpe - mkobit
我已经找到了解决方案。如果你想在DynamoDBQueryExpression对象上设置限制,那么请使用mapper.queryPage()方法,而不是mapper.query()方法。这是Amazon SDK的一个奇怪错误,如果我们调用带有limit参数设置的mapper.query()方法,它会抛出NetworkOnMainThreadException:D :D - Shaw
大家好,我已成功连接到 Dynamo DB,但我的结果集不包含任何数据...真奇怪,我还能寻找什么来解决这个问题。 - divyanayan awasthi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接