2017-04-23 46 views
2

我想按值排序映射。例如,我有類,它具有地圖詳細信息,它們存儲在鍵值爲Map<String, String>的地圖中。彈簧數據按給定鍵內的映射值排序

我使用hibernate5的springboot。這是映射。

public class Person implements Serializable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @DocumentId 
    @Column(name = "personid") 
    private Integer id; 

    @Column(name = "name") 
    private String name; 

    // this is a collection of person details 
    @ElementCollection() 
    @MapKeyColumn(name = "detailkey") 
    @Column(name = "detailvalue") 
    @CollectionTable(name = "details", joinColumns = @JoinColumn(name = "personid")) 
    Map<String, String> details = new HashMap<>(); 

    //getter and setters omitted 

到目前爲止,我能夠檢索到具有某些特定的詳細信息和關鍵特定細節值的人。因此,例如在一個數據庫中的人表有眼睛顏色的詳細屬性和值可以有「綠色」,「藍色」,「棕色」。請注意,這不是一個真實的例子,只是爲了清晰起見。

因此,舉例來說,我可以得到人的名單,並通過他們的名字排序,在控制器我可以做

Sort sort = new Sort(Sort.Direction.ASC, "name"); 

和相反方向

Sort sort = new Sort(Sort.Direction.DESC, "name"); 
Pageable pageable = new PageRequest(1, 10, sort); 
pageResult = personRepository.findAll(
      "eyecolor", "green", pageable 
     ); 

而這一次將返回「eyecolor」爲綠色的人員列表。到目前爲止這麼好,這是按預期工作。現在我想定義一個關於detailvalue的排序。

例如,我想獲得按照他們的眼睛顏色排序的人員列表。因此,首先我應該有「藍色」,「棕色」,「綠色」的人。

如何在這種情況下指定Sort?

在標準的SQL它會是這樣的:

SELECT P *從人p LEFT JOIN細節d在 p.personid = d.personid AND p.detailkey = 'eyercolor' ORDER BY p .detailvalue ASC;

回答

1

下面的查詢工作對我來說:

SELECT p FROM Person p JOIN p.details d WHERE KEY(d) = 'eyecolor' ORDER BY d 

(注意:ORDER BY VALUE(d)會失敗,因爲VALUE(d)似乎仍然表現爲如下所述:JPA's Map<KEY, VALUE> query by JPQL failed

現在,我不是特別好熟悉春季數據,但我想你應該能夠在PersonRepository.findAll方法(我假設這是一種自定義方法)上使用上述查詢(不包含ORDER BY部分)和@Query註釋,並使用JpaSort.unsafe("d")提供排序。