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

时间:2010-01-12 18:25:39

标签: java sql hibernate

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

大致考虑以下数据库表:

actor ( id, name )
credit ( actorId, movieId, roleName )
movie ( id, title, year )

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

所以我希望能够让默认的排序顺序在电影年份之前按降序返回演员的积分:

actor.getCredits(); // Returns credits in order of Credit.movie.year

使用@OrderBy进行排序似乎很容易加入一层,例如@OrderBy(“roleName”)......但是如何更深入地加入另一个?

谢谢!

2 个答案:

答案 0 :(得分: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;
    }

}

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

的问候,

答案 1 :(得分:1)

您也可以使用order by子句在查询时实现此目的,如下所示: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-ordering