如何在SpringJPAHibernate中使用分页和排序功能按嵌套字段正确排序?

zbdgwd5y  于 2023-03-19  发布在  Spring
关注(0)|答案(1)|浏览(168)

我有以下实体(短版本):

@Entity
class Parent {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Long id;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "parentId")
    @OnDelete(action = OnDeleteAction.CASCADE)
    @Builder.Default
    @ToString.Exclude
    private List<Child> children = new ArrayList<>();
}

@Entity
class Child {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Long id;

    @Column(nullable = false)
    private Long parentId;

    @Column(nullable = false)
    private String age;
}

我使用的是Specification Builder,注意,子类中还有很多其他的字段,排序对所有这些字段都有效,为此我将其命名为“age”。
当我尝试根据孩子的字段年龄对父母进行排序时,如果一个父母有不同年龄的孩子,我就得不到正确的结果。
例如:

Parent1 = [
Child{
   age: 12
}
Child{
   age: 12
}
Child{
   age: 12
}

],
Parent2 = [
Child{
   age: 5
}
Child{
   age: 5
}
Child{
   age: 5
{
],
Parent3 = [
Child{
   age: 20
}
Child{
   age: 20
}
Child{
   age: 10
{
]

排序后的结果是parent 2、parent 1、parent 3,即使parent 3有一个10岁的孩子,我想得到:父2,父3,父1。
我想知道这有可能吗?我的意思是父母3有3个孩子-- 2个孩子20岁,只有一个10岁,因此我希望父母3出现在父母1之前。但我无法让它工作。
我认为这个问题可能是因为年龄实际上是一个字符串,但我已经尝试添加额外的字段:

@Formula(value = "ABS(age)")
private Integer age;

但结果一样。
有人有什么想法吗?

0qx6xfy6

0qx6xfy61#

这是可能的,但是你需要使用窗口函数来实现这个目的。在Hibernate 6中你可以简单地使用下面的函数:

select p 
from Parent p 
join fetch p.children c 
order by min(c.age) over(partition by p.id)

相关问题