Skip to content

Same field as DynamoDBRangeKey and DynamoIndexDBRangeKey is causing issue #76

Open
@jaychapani

Description

@jaychapani

Hello Experts,

Below is the code that I am using in my application.
DateTime is the field used as sort key for table and GSI.
When we query as below using below method in the interface which extends DynamoDBCrudRepository<DemoClass, DemoClassPrimaryKey>. I am getting exception as mentioned below.

List<DemoClass> findByDemoSerialNumberAndDateTimeBetween(String demoSerialNumber, String startDateTime, String endDateTime);

Exception
Illegal query expression: No hash key condition is applicable to the specified index (DemoAttribId-DateTime-index).

Also when I am calling below method, It is using scan instead of query.

List<DemoClass> findByDemoAttribIdInAndDateTimeBetween(List<Long> demoAttribIds, String startDateTime, String endDateTime);
public class DemoClass {

    //Seeds for hash builder, must be non-zero, odd numbers, unique per class
    private final int HASH_SEED_A = 19;
    private final int HASH_SEED_B = 43;
 
    public DemoClass() {
        this.demoClassPrimaryKey = new demoClassPrimaryKey();
    }
 
    @Id
    private DemoClassPrimaryKey demoClassPrimaryKey;
 
    @DynamoDBHashKey(attributeName = "DemoSerialNumber")
    public String getDemoSerialNumber() { return demoClassPrimaryKey.getDemoSerialNumber(); }
    public void setDemoSerialNumber(String demoSerialNumber) { demoClassPrimaryKey.setDemoSerialNumber(demoSerialNumber); }
 
    @DynamoDBIndexRangeKey(attributeName = "DateTime", globalSecondaryIndexName="DemoAttribId-DateTime-index")
    @DynamoDBRangeKey(attributeName = "DateTime")
    public String getDateTime() { return demoClassPrimaryKey.getDateTime(); }
    public void setDateTime(String dateTime) { demoClassPrimaryKey.setDateTime(dateTime); }
 
    @DynamoDBIndexHashKey(attributeName = "DemoAttribId", globalSecondaryIndexName="DemoAttribId-DateTime-index")
    @Getter
    @Setter
    private Long demoAttribId;
    
 
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
 
        DemoClass demoClass = (DemoClass) o;
 
        return new EqualsBuilder()
                .append(demoClassPrimaryKey, demoClass.demoClassPrimaryKey)
                .append(getDemoSerialNumber(), demoClass.getDemoSerialNumber())
                .append(getDateTime(), demoClass.getDateTime())
                .append(getDemoAttribId(), demoClass.getDemoAttribId())
                .isEquals();
    }
 
    @Override
    public int hashCode() {
        return new HashCodeBuilder(HASH_SEED_A, HASH_SEED_B)
                .append(getDemoSerialNumber())
                .append(getDateTime())
                .append(getDemoAttribId())
                .toHashCode();
    }
}

@NoArgsConstructor
public class DemoClassPrimaryKey implements Serializable {
    // Seeds for hash builder, must be non-zero, odd numbers, unique per class
    private final int HashSeedA = 7;
    private final int HashSeedB = 23;
 
    @Getter
    @Setter
    @DynamoDBHashKey
    private String demoSerialNumber;
 
    @Getter
    @Setter
    @DynamoDBRangeKey
    private String dateTime;
 
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
 
        DemoClassPrimaryKey demoClassPrimaryKey = (DemoClassPrimaryKey) o;
 
        return new EqualsBuilder()
                .append(getDemoSerialNumber(), demoClassPrimaryKey.getDemoSerialNumber())
                .append(getDateTime(), demoClassPrimaryKey.getDateTime())
                .isEquals();
    }
 
    @Override
    public int hashCode() {
        return new HashCodeBuilder(HashSeedA, HashSeedB)
                .append(demoSerialNumber)
                .append(dateTime)
                .toHashCode();
    }
}

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions