amazon-dynamodbsecondary-indexes

How to query a Dynamo DB having a GSI with only hashKeys using DynamoDBMapper


I am very new to Dynamo DB and may be this is very trivial question, but i went through the documents of Dynamo DB and stack overflow questions but i couldnt find a single link which tells how to query DDB for GSI which has only hash key and there are no range key specified for the same.

I get the exception Illegal query expression: No hash key condition is found in the query.


Solution

  • On your DynamoDB annotated model object, you should use @DynamoDBIndexHashKey(globalSecondaryIndexName = "gsiIndexName) to signify that it is a hash key for the GSI:

    @DynamoDBTable(tableName = "myTable")
    public class MyTable {
        ...
    
        @DynamoDBIndexHashKey(globalSecondaryIndexName = "myGsi")
        public String getGsiHk() {
            return gsiHk;
        }
    
        ...
    }
    

    And then use the query method on the DynamoDBMapper:

    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);