Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa spring数据按给定键内的映射值排序_Jpa_Spring Data_Hibernate Mapping - Fatal编程技术网

Jpa spring数据按给定键内的映射值排序

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

我想按值对地图进行排序。例如,我有一个Person类,它有一个详细信息的映射,存储在一个带有键值
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