Jpa spring数据按给定键内的映射值排序
我想按值对地图进行排序。例如,我有一个Person类,它有一个详细信息的映射,存储在一个带有键值Jpa spring数据按给定键内的映射值排序,jpa,spring-data,hibernate-mapping,Jpa,Spring Data,Hibernate Mapping,我想按值对地图进行排序。例如,我有一个Person类,它有一个详细信息的映射,存储在一个带有键值map的映射中 我正在使用springboot和hibernate5。这是地图 public class Person implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @DocumentId @Column(name = "personid") p
map
的映射中
我正在使用springboot和hibernate5。这是地图
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.DESC, "name");
Pageable pageable = new PageRequest(1, 10, sort);
pageResult = personRepository.findAll(
"eyecolor", "green", pageable
);
这个将返回“eyecolor”为绿色的人员列表。到目前为止,一切都很好,这是预期的工作。现在我想在detailvalue上定义一个排序
例如,我想得到一个按眼睛颜色排序的人的列表。因此,首先我应该让那些有“蓝色”、“棕色”、“绿色”的人
在这种情况下,如何指定排序
在标准SQL中,它应该是这样的:
从人员p左连接详细信息d中选择p.*
p、 personid=d.personid和p.detailkey='eyercolor'顺序依据
p、 详细值ASC 以下查询对我有效:
SELECT p FROM Person p JOIN p.details d WHERE KEY(d) = 'eyecolor' ORDER BY d
(请注意,orderbyvalue(d)
将失败,因为VALUE(d)
的行为似乎仍如本文所述:)
现在,我对Spring数据不是特别熟悉,但我认为您应该能够使用上面的查询(没有orderby
部分)和PersonRepository.findAll
方法上的@query
注释(我假设这是一个自定义方法),并使用JpaSort.unsafe(“d”)提供排序
SELECT p FROM Person p JOIN p.details d WHERE KEY(d) = 'eyecolor' ORDER BY d