对JPA查询中返回的子对象进行排序

mv1qrgav  于 2022-11-14  发布在  其他
关注(0)|答案(4)|浏览(182)

因此,如果我的JPA查询如下所示:从父级p左连接提取p.子级按p.someProperty排序
我正确地得到了按p.someProperty排序的结果,并且正确地得到了急切地获取和填充的p.children集合。但是我希望我的查询类似于“order by p.someProperty,p.children.someChildProperty”,这样填充到每个父对象中的集合就按someChildProperty进行了子排序。
当我考虑为这些调用实际生成的sql时,这似乎是直观的,但当它试图Map回层次对象时,我猜就不那么直观了。

jtjikinw

jtjikinw1#

为了保持顺序,使用TreeSet。至于在父级中对集合进行排序,只需在代码中使用Comparator即可。
好吧,在父实体类中的集合定义上试试这个。我希望你明白我的意思。
您可以使用这个JPA注解,

@javax.persistence.OrderBy(value = "fieldName")

或者这个特定于Hibernate,

@org.hibernate.annotations.OrderBy(clause = "FIELD_NAME asc")

你也可以用这个

@org.hibernate.annotations.Sort(type = SortType.NATURAL)

@org.hibernate.annotations.Sort(type = SortType.COMPARATOR)

在比较器的情况下,必须有一个比较器。其他的可能只适用于String集合。

ctzwtxfj

ctzwtxfj2#

如果您使用的是springboot和jpa,下面是一个示例
在父类中添加如下代码

@OneToMany(mappedBy = "user")
@OrderBy(value = "position desc ")
private List<UserAddresses> userAddresses;

在上面的代码中,position是UserAddresses类中的字段名,desc是顺序。您可以像在sql order by中一样传递ascdesc

5vf7fwbs

5vf7fwbs3#

Adeel基本上已经确定了这一点。你也可以使用那些带有列表的,如果你的集合不止一次包含同一个实体,这可能很重要。

kqlmhetl

kqlmhetl4#

当调用扩展org.springframework.data.jpa.repository.JpaRepository的存储库类中的方法时,可以使用org.springframework.data.domain.Sort来实现这一点。
例如,假设Teacher实体是School的子实体,Student实体是Teacher的子实体

teacherRepository.findAll(Sort.by("school.name", "student.lastName"))

将先按父实体的name属性,然后按子实体的lastName属性对结果进行排序。
注意:将子属性添加到排序中当然会在生成的查询中强制联接到子表。在这种情况下,如果有多个Student实体具有相同的lastName属性,则返回的记录数会更大,除非显式要求不同的记录。

相关问题