如何在hibernate中对关联表进行排序?

Mik*_*ike 8 java sql hibernate

给定两个实体通过连接表连接的数据库表的表示,是否可以通过注释以某种方式对指定排序顺序的另一个实体进行排序?

大致考虑以下数据库表:

actor ( id, name )
credit ( actorId, movieId, roleName )
movie ( id, title, year )
Run Code Online (Sandbox Code Playgroud)

和hibernate实体一样:

@Entity
class Actor {
    @Id
    Integer id;
    @Column
    String name;
    @OneToMany
    @JoinColumn(name = "actorId")
    List<Credit> credits;
}

@Entity
class Credit {
    @Column
    String roleName;
    @ManyToOne
    @JoinColumn(name = "movieId")
    Movie movie;
}

@Entity
class Movie {
    @Id
    Integer id;
    @Column
    Integer year;
    @Column
    String title;
}
Run Code Online (Sandbox Code Playgroud)

所以我希望能够让默认的排序顺序按照电影年份的降序返回一个Actor的Credits:

actor.getCredits(); // Returns credits in order of Credit.movie.year
Run Code Online (Sandbox Code Playgroud)

通过使用@OrderBy,例如@OrderBy("roleName")进行排序似乎非常简单,只有一层深度的加入......但是如何更深入地进行另一次加入呢?

谢谢!

Art*_*ald 3

根据JPA规范:

属性或字段名称必须与关联类的持久属性或字段的名称相对应

它解释了为什么 @OrderBy("movie.year") 不能按预期工作

除非您使用 HQL 查询,否则您应该使用封装来实现您的目标

@Entity
public class Actor {

    private List<Credits> credits = new ArrayList<Credits>();

    @OneToMany
    @JoinColumn(name="ACTOR_ID")
    public List<Credits> getCredits() {
        return this.credits;
    }

    @Transient
    public List<Credits> getCreditsOrderedByMovieYear() {
        Collections.sort(credits, new Comparator<Credits>() {
            public int compare(Credits o1, Credits o2) {
                // Integer implements Comparable<T>
                return o1.getMovie().getYear().compareTo(o2.getMovie().getYear());
            }
        });

        return credits;
    }

}
Run Code Online (Sandbox Code Playgroud)

有时,当 Hibernate 不提供某些自定义行为时,我使用封装来实现我的目标

问候,

  • 该解决方案有一个严重的缺点,即分页现在变得不可能,因为结果是在应用程序层而不是数据库层排序的! (2认同)