【问题标题】:How to query a Dynamo DB having a GSI with only hashKeys using DynamoDBMapper如何使用 DynamoDBMapper 查询具有仅具有 hashKeys 的 GSI 的 Dynamo DB
【发布时间】:2015-08-08 02:01:30
【问题描述】:

我对 Dynamo DB 很陌生,这可能是一个非常微不足道的问题,但我浏览了 Dynamo DB 的文档和堆栈溢出问题,但我找不到一个链接来说明如何查询只有散列键且没有指定范围键的 GSI 的 DDB。

我收到异常 Illegal query expression: No hash key condition is found in the query。

【问题讨论】:

  • 为了明确全局二级索引仅由 HashKey 而没有范围键组成,我如何使用 DynamoDBMapper 为其生成查询?

标签: amazon-dynamodb secondary-indexes


【解决方案1】:

在您的 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 给我带来了同样的问题。
  • 嗨@mkobit:您发送的代码运行良好,但是当我添加 queryExpression.withLimit(10);它给出了这个错误:无法评估表达式方法抛出'android.os.NetworkOnMainThreadException'异常。我正在使用 RxAndroid 进行网络操作
  • @Shaw 我不熟悉 Android 细节,但我猜你不能在主 UI 线程上进行阻塞调用 - 请参阅 stackoverflow.com/questions/6343166/…
  • 我找到了解决方案。如果要对 DynamoDBQueryExpression 对象设置限制,则使用 mapper.queryPage() 方法,而不是 mapper.query() 它在 Amazon SDK 上是一个奇怪的错误,如果我们调用带有限制参数集的 mapper.query() 方法,它会给出NetworkOnMainThreadException :D :D
  • 大家好,我能够成功连接到 dynamo db,但我的结果集不包含任何数据……这很奇怪,我还能寻找什么来解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
相关资源
最近更新 更多