【问题标题】:Hibernate Entity sort column configurationHibernate Entity排序列配置
【发布时间】:2009-09-09 00:33:05
【问题描述】:

是否有一个 Hibernate 配置(希望是映射 @Column 字段的类上的注释),当 session.load(Entity.class , id) 被调用?

例如,如果我有一个包含与 EntityB 的 OneToMany 关联的 EntityA。

@Entity
public class EntityA {
    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY) 
    private Set<EntityB> headlines = new TreeSet<Entity>();

}

我希望 EntityB 在从 Hibernate 返回的 Set 中排序。

【问题讨论】:

    标签: java sql database hibernate


    【解决方案1】:

    session.load() 加载单个实体实例。不涉及排序。

    更新(基于问题编辑):

    @OrderBy("column_name") 可用于按给定列对实体内的集合元素进行排序;但是,这只对保持其顺序的集合有意义(例如 List,而不是 Set):

    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY) 
    @OrderBy("name")
    private List<EntityB> headlines = new ArrayList<Entity>();
    

    【讨论】:

    • 我使用了一个 SortedSet 并使用了 @Sort 注释(但是 stackoverflow 上有人认为这是一个错误的答案,知道为什么吗?)
    • @Dougnukem 我意识到这是一篇旧帖子,但希望这对其他人有所帮助:@Sort 是一个“坏”主意,因为排序发生在应用程序服务器上。使用@OrderBy,列表在数据库服务器上排序。一般来说,最好让数据库处理排序,因为这是它的优势之一。
    【解决方案2】:

    Session.load 不加载列表,只加载单个对象。

    您可以在从数据库中检索实体列表时对它们进行排序,方法是使用条件上的 addOrder() 方法。

    如果您有一个包含子列表的父类,则可以使用 @OrderBy 注释对子类进行排序(请参阅Hibernate Annotations - Collections

    【讨论】:

      【解决方案3】:

      我使用@Sort 和一个 SortedSet 集合来映射我的关联,这需要我的实体实现 Comparable 接口(int compareTo(T) 方法)。

      @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
      @Sort(type=SortType.NATURAL)    
      private SortedSet<Entity> headlines = new TreeSet<Entity>();
      

      【讨论】:

      • 为什么这是一个糟糕的解决方案?
      • 如果headlines是在内存中创建的,这不是一个糟糕的解决方案。每个场景都不同,但一般来说,如果它是从数据库加载的,出于性能原因,您希望让数据库为您进行排序。
      【解决方案4】:

      没有。您可以仅在集合级别 (@OrderBy) 或通过 hql 或条件 api 选择排序。

      【讨论】:

        猜你喜欢
        • 2017-05-05
        • 1970-01-01
        • 2010-09-24
        • 2011-03-09
        • 1970-01-01
        • 2012-09-16
        • 1970-01-01
        • 2011-01-26
        • 2023-01-13
        相关资源
        最近更新 更多