java - 使用 JPA 先由父级排序,然后由子级排序

标签 java hibernate jpa

是否可以同时通过父对象的属性和子对象的属性对父对象的集合进行排序?

假设我有一个实体类,其中包含以下代码:

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

父亲实体有一个年龄属性,我们希望按年龄升序排序(如上所示)。

父亲可以有 child 。 child 也有年龄属性。我希望 getFathers() 返回一个父亲列表,以便它们按父亲的年龄排序,然后按 child 的年龄升序排列。

如果我按原样保留上面的代码,父亲将按自己的年龄正确排序,但带着 10 岁 child 的父亲(30 岁)可能会排在带着 5 岁 child 的父亲(同样 30 岁)之前 child 。

我尝试做这样的事情:

@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;
    }
}

假设有一个村庄,你可以获得住在这个村庄里的父亲。为了这个例子,我们假设一位父亲遵守一些奇怪的村规,每个人只能有一个 child 。

所以父亲看起来像这样:

@Entity
public class Father {
    private Child child;
    ...

    @OneToOne(mappedBy = "father")
    public Child getChild() {
        return child;
    }

    public void setChild(Child child) {
        this.child = child;
    }
}

所以现在在原来的 Village 类中,我希望 getFathers() 按年龄顺序返回所有父亲,另外,如果有任何父亲年龄相同,我希望他们是然后按 child 的年龄排序。

编辑2:我还发现我可以获得我想要的效果,但这不是最优雅的方式:

session.createFilter(village.getFathers(), "order by child.age");

最佳答案

您似乎缺少双向映射。您还应该映射 ChildFather .

顺便说一句,Father之间应该是一对多的关系和Child ,传统上来说。这意味着 Father类应该有一个 List<Child> children;属性(property),而不是相反。

[编辑]

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

关于java - 使用 JPA 先由父级排序,然后由子级排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4180941/

相关文章:

java - @embedded 注解有什么影响?

JSF 2 重用 JPA 实体中定义的验证?

mysql - 尝试在 mysql 数据库中持久保存一个对象

java - 具有动态值的 Spring REST 拦截器

java - 他们用什么语言构建其他语言?

java - WebSphere Server V.8.5 与 Eclipse 项目相关的问题

java - 为 Spring Data/hibernate 中的实体获取异常

java - 如何为我的媒体播放器创建停止按钮

java - 考虑在您的配置中定义一个类型为 'org.hibernate.SessionFactory' 的 bean

java - Spring 与 Hibernate 和 JPA 集成 - 一张表不是在启动时创建的,其他表是在启动时创建的