我有以下实体(短版本):
@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;
但结果一样。
有人有什么想法吗?
1条答案
按热度按时间0qx6xfy61#
这是可能的,但是你需要使用窗口函数来实现这个目的。在Hibernate 6中你可以简单地使用下面的函数: