0

數據REST和dynamoDB並試圖如下排序我的GSI的對象,是有可能在dynamoDB排序GSI Hashkey, 域類如何排序的全球次級索引DynamoDB

@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鍵的hashkey屬性組合以獲取所有可能的結果。我需要獲取滿足搜索和orderBy名稱(GSI)的名稱。否則DynamoDB僅支持通過hashkey和範圍鍵(如Demo中的orderBy)?

當我這樣做得到一個異常爲「無法使用orderBy掃描查詢」。

更新:使用 上午春數據DynamoDB,我已經創建了名爲「描述名稱索引」一GSI的哈希和密鑰索引中DynamoDB和我喜歡湊findBy使用範圍關鍵的數據進行排序鍵。這裏是我的測試代碼, 域類

@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散列和範圍對並對它們進行排序。

回答

0

您收到的錯誤消息對我來說很有意義,因爲在DynamoDB中掃描將以隨機順序返回所有項目(即,您無法指定掃描操作的順序)。

您想獲得按名稱排序的所有行。一種天真的做法是創建一個帶有單個虛擬散列鍵的GSI,範圍鍵爲名稱。 GSI中的所有行將具有相同的hashkey。這樣GSI可以按名稱對所有行進行排序。

上述解決方案的工作,但它有一個hostspot問題...

+0

這裏有GSI鍵進行排序或排序在Java迭代器掃描輸出是不錯的選擇。我應該去哪一個,哪一個會有效呢? – jAddict

+0

我建議對掃描輸出進行排序,因爲它更直接,不易出錯 –

相關問題