是否可以通过父级属性和子级属性来订购父对象的集合?
假设我有一个包含这段代码的实体类:
@OrderBy("age")
public List<Father> getFathers() {
return fathers;
}
父实体有一个年龄属性我们想按升序年龄排序(如上所示)。
父亲可以生孩子。孩子也有年龄属性。我希望getFathers()
返回一个父亲名单,以便他们按照父亲的年龄排序,然后随后儿童的年龄上升。
如果我按原样保留上面的代码,父亲将按照他们自己的年龄正确订购,但是一位10岁儿童的父亲(30岁)可以来到一位5岁的父亲(也是30岁)子。
我尝试过这样的事情:
@OrderBy("age, child.age")
public List<Father> getFathers() {
return fathers;
}
但我会得到以下例外:
org.hibernate.AnnotationException: property from @OrderBy clause not found: Father.child.age
编辑:抱歉,让我澄清一下代码。 getFathers()
不在Child实体中,而在另一个实体中。我们称之为村庄:
@Entity
public class Village {
...
@OneToMany(mappedBy = "village",
targetEntity = Father.class)
@OrderBy("age")
public List<Father> getFathers() {
return fathers;
}
}
所以,假设有一个村庄,你可以获得住在这个村庄的父亲。为了这个例子,让我们说一个奇怪的村庄规则的父亲每个只能有一个孩子。
所以父亲会看起来像这样:
@Entity
public class Father {
private Child child;
...
@OneToOne(mappedBy = "father")
public Child getChild() {
return child;
}
public void setChild(Child child) {
this.child = child;
}
}
所以现在在原来的乡村班里,我希望getFathers()
按年龄顺序归还所有父亲,另外,如果有同龄的父亲,我希望他们按年龄排序他们的孩子。
编辑2:我也发现我可以得到我想要的效果,但它不是最优雅的方式:
session.createFilter(village.getFathers(), "order by child.age");
答案 0 :(得分:3)
您似乎缺少双向映射。您还应该在Child
中映射Father
。
顺便说一句,传统上说Father
和Child
之间应该存在一对多的关系。这意味着在Father
课程中应该有List<Child> children;
属性,而不是相反。
<强> [编辑] 强>
不,你不能这样做。为什么?因为当您定义@OrderBy("age, child.age")
时,整个child.age
将被视为属性。它将被视为String
。因此,实际上,child.age
类中没有任何属性名Father
。我希望你明白我的观点。所以,你提出的Filter
解决方案是一个很好的方法。