Open
Description
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();
}
}