Data-REST和dynamoDB并尝试按如下方式对我的GSI对象进行排序,是否可以在dynamoDB中对GSI Hashkey进行排序, Domain class
@DynamoDBTable(tableName = "test")
public class Test implements Serializable{
private static final long serialVersionUID = 1L;
private String id;
private String name;
private String desc;
@DynamoDBHashKey(attributeName="id")
@DynamoDBAutoGeneratedKey
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@DynamoDBIndexHashKey(attributeName="name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@DynamoDBAttribute(attributeName="desc")
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
public interface TestRepository extends PagingAndSortingRepository{
@EnableScan
@EnableScanCount
public Page<Test> findByName(@Param("name") String name, Pageable pageable);
public Page<Test> findByNameOrderByNameAsc(@Param("name") String name, Pageable pageable);
}
是否可以在二级索引上使用orderBy,因为我使用自动生成的哈希键,因此无法将hashkey属性与Range键结合以获取所有可能的结果 . 我需要获取满足搜索和orderBy名称(GSI)的名称 . 或者,DynamoDB只支持orderBy通过hashkey和范围键,如Demo?
当我这样做时,我得到一个例外,因为“不能在扫描查询中使用orderBy” .
UPDATED: 使用Spring Data DynamoDB,我在名为"description-name-index"的DynamoDB中创建了一个GSI哈希和密钥索引,我喜欢使用hash键的findBy使用范围键对其数据进行排序 . 这是我的测试代码, Domain Class
@DynamoDBTable(tableName = "test")
public class Test implements Serializable{
private static final long serialVersionUID = 1L;
private String id;
private String description;
private String name;
@DynamoDBIndexHashKey(attributeName="description")
public String getDescription() {
return tesId;
}
public void setDescription(String description) {
this.setDescription(description);;
}
@DynamoDBIndexRangeKey(attributeName="name")
public String getName() {
return name;
}
public void setName(String name) {
this.setName(name);
}
@DynamoDBHashKey(attributeName="id")
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
并尝试使用 findByDescriptionOrderByNameDesc(@Param("decription") String description, Pageable pageable)
获取和排序数据,并且我尝试使用 @Id
并在类中放置了索引散列和范围键,但都是徒劳的 . 我得到 500 Internal Error
但没有抛出任何消息 . 有没有办法使用GSI散列和范围对并对它们进行排序 .
1 回答
你得到的错误信息对我有意义,因为在DynamoDB中扫描将以随机顺序返回所有项目(即,您无法指定扫描操作的顺序) .
您希望获取按名称排序的所有行 . 一种简单的方法是使用单个虚拟哈希键创建GSI,范围键将是名称 . 该GSI中的所有行都将具有相同的hashkey . 这样,GSI可以按名称对所有行进行排序 .
上述解决方案可行,但它有一个hostspot问题......