我想根据值对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;
答案 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
提供排序。