2010-11-15 98 views
0

命令是否可以通过父母的属性和孩子的属性来订购父对象的集合?父母和孩子使用JPA

比方说,我有了这段代码的实体类:

@OrderBy("age") 
public List<Father> getFathers() { 
    return fathers; 
} 

父实体,我们希望通过提升年龄订购(如上图所示),年龄属性。

父亲可以有一个孩子。一个孩子也会有一个年龄属性。我想getFathers()返回一个父亲名单,使他们是由父亲的年龄,然后随着儿童的年龄上升。

如果我保持上面的代码是正确的,那么父亲将按照他们自己的年龄正确排列,但有一个10岁儿童的父亲(30岁)可以在父亲(也是30岁)之前来到5年老孩子。

我试图做这样的事情:

@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

用映射的属性显示您的两个类。为简洁起见,请省略其他属性。 – 2010-11-15 04:20:55

+0

当然!你可以用'Filter'来完成,但是你仍然需要'Father'类中的'child'属性。 – 2010-11-18 04:58:34

回答

3

好像你是缺少双向映射。您还应该在Father中映射Child

顺便说一下,传统上讲,FatherChild之间应该存在一对多的关系。这意味着在Father类应该有一个List<Child> children;财产,而不是相反。

[编辑]

不,你不能做这样的。为什么?因为当你定义你的@OrderBy("age, child.age")时,它的全部,child.age将被视为属性。它将被视为String。因此,实际上,您在Father类中没有任何属性名称child.age。我希望你明白我的观点。所以,你提出的Filter解决方案是一个好方法。

+0

我的Father类始终有Child属性,并且仍然导致Order By异常。 – digiarnie 2010-11-18 23:56:09

+0

@digiarnie:不,你不能那样做。为什么?因为当你定义你的'@OrderBy(“age,child.age”)'时,它的整个'child.age'将被视为一个属性。它将被视为一个'String'。因此,实际上,您在“父”类中没有任何属性名称“child.age”。我希望你能找到我。所以,'滤波器'解决方案是一个好方法。 – 2010-11-19 02:46:23

+0

感谢您的解释。 – digiarnie 2010-11-19 03:51:26