【问题标题】:How to sort through an association table in hibernate?如何在hibernate中对关联表进行排序?
【发布时间】:2010-01-12 18:25:38
【问题描述】:

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

大致考虑以下数据库表:

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

以及休眠实体,例如:

@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") ...但是我如何进行更深层次的连接?

谢谢!

【问题讨论】:

    标签: java sql hibernate


    【解决方案1】:

    根据 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 不提供一些自定义行为时,我使用封装来实现我的目标

    问候,

    【讨论】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多