2017-04-23 58 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")提供排序。