弹簧数据按给定键

时间:2017-04-23 16:13:54

标签: jpa spring-data hibernate-mapping

我想根据值对Map进行排序。例如,我有类,其中包含详细信息的地图,这些地图存储在具有键值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

到目前为止,我能够检索具有某些特定详细信息密钥和特定详细信息值的人员。因此,例如,数据库中的人员表具有 eyecolor 作为详细信息属性,并且值可以具有&#34; 绿色&#34;,&#34; 蓝色&#34;,&#34; 棕色&#34;。请注意,这不是一个真实的例子,只是为了清晰起见。

因此,例如,我可以获取人员列表并按照他们的名字对其进行排序,在我可以执行的控制器中

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
        );

这个人将返回有&#34; eyecolor&#34;如绿色。到目前为止这么好,这是按预期工作的。现在我想在detailvalue上定义一个排序。

例如,我希望获得按其眼睛颜色排序的人员列表。首先,我应该让那些拥有&#34; 蓝色&#34;,&#34; 棕色&#34;,&#34; 的人绿色&#34;

在这种情况下如何指定Sort?

在标准SQL中,它将是这样的:

SELECT p。* from people p LEFT JOIN details d ON   p.personid = d.personid和p.detailkey =&#39; eyercolor&#39;订购   p.detailvalue ASC;

1 个答案:

答案 0 :(得分: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

现在,我对Spring Data并不是特别熟悉,但我想你应该能够在{{{ORDER BY注释上使用上面的查询(没有@Query部分) 1}}方法(我假设这是一个自定义方法)并使用PersonRepository.findAll提供排序。

相关问题