2009-09-09 60 views
1

是否有Hibernate配置(希望在类映射的@Column字段上有一个注释),它允许我在会话时对该实体的给定列与负载实体关联的实体集合进行排序。 load(Entity.class,Id)被调用?Hibernate实体排序列配置

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

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

} 

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

回答

8

session.load()加载单个实体实例。不涉及分拣。 (基于问题编辑)

更新

@OrderBy("column_name")可用于由给定列实体内收集元素进行排序;然而,只有有意义维持它们的顺序集合(如列表,而不是设置):

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

我用的SortedSet和使用的@Sort注释(但有人在计算器认为这是一个不好回答,任何想法,为什么?) – Dougnukem 2009-09-12 18:46:22

+1

@Dougnukem我知道这是一个旧帖子,但希望这可以帮助别人:'@ Sort'是一个'坏'的想法,因为排序发生s在应用程序服务器上。通过'@ OrderBy',列表在数据库服务器上排序。通常最好让数据库处理排序,因为它是它的优势之一。 – egallardo 2013-05-15 23:16:51

0

号,只可以选择在集合级别(@OrderBy)或通过量HQL或标准API订货。

1

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

当您通过在条件上使用addOrder()方法从数据库中检索实体时,您可以对实体进行排序。

如果你有孩子列表的父类,你可以订购与@OrderBy注释的儿童(见Hibernate Annotations - Collections

1

我用@Sort和SortedSet的集合映射我的协会,要求我的实体实现Comparable接口(INT的compareTo(T)方法)。

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

为什么这是一个不好的解决方案? – Dougnukem 2009-09-12 18:45:28

+0

如果'headlines'在内存中创建,这不是一个不好的解决方案。每个场景都是不同的,但通常情况下,如果它是从数据库加载的,则出于性能原因,您希望让数据库为您排序。 – egallardo 2013-05-15 23:23:32