我想按值排序映射。例如,我有人类,它具有地图详细信息,它们存储在键值为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;