父母和孩子使用JPA订购

时间:2010-11-15 02:17:53

标签: java hibernate jpa

是否可以通过父级属性和子级属性来订购父对象的集合?

假设我有一个包含这段代码的实体类:

@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");

1 个答案:

答案 0 :(得分:3)

您似乎缺少双向映射。您还应该在Child中映射Father

顺便说一句,传统上说FatherChild之间应该存在一对多的关系。这意味着在Father课程中应该有List<Child> children;属性,而不是相反。

<强> [编辑]

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