2011-09-30 203 views
1

我们通常一直在使用集合来处理休眠中的一对多和多对多集合。迄今为止这工作得很好。如何在休眠状态下获得可排序的集合

但是现在我们需要越来越多的在控制器层对子集合进行内存中排序,因为不同的视图需要以不同的顺序查看子集合。我们不能只在实体声明中指定适用于所有视图的订单。

我们的问题是,你不能Collections.sort一个集合,我们担心我们的包裹在设置列表中,因为这可能会破坏我们的结合(特别是父子关系)。

所以我们正在考虑改变我们所有的坐落在实体列表(没有索引列),但似乎极端,我读过的双向一对多和多对多的关系列表的问题。

有什么建议吗?

+2

不知道你的意思是“可能会打破我们的结合”,这是很难回答的问题。我不会更改这些实体,除了可能添加一个getFoosAsList方法,该方法将返回一组由Foos持久集合构建的列表。 –

回答

1

您可以让您的设置对象实现可比较的<>接口。

以这种方式使用compareTo函数(您必须实现),您可以指定您的集合的订单。

初始化集合的Hibernate将使用compareTo函数中指定的顺序。

0

您可以定义一个Formula(在标准中)或SortedSet并实施comparator。在集合的定义中,您还可以(在3.3中)定义一个order-by元素(SQL)。

例子:

Formula: Made in DBMS for a particular relation. 
<many-to-one name="homeAddress" class="Address" insert="false" update="false"> 
    <column name="person_id" not-null="true" length="10"/> 
    <formula>'ORDER BY LENGTH(homeAddress)'</formula> 
</many-to-one> 

Formula in Criteria: Made in DBMS. 
sortedUsers = s.createFilter(group.getUsers(), "order by this.name").list(); 

Sorted: Made in Java and application wide for a particular relation. 
<map name="holidays" sort="my.custom.HolidayComparator"> 
    <key column="year_id"/> 
    <map-key column="hol_name" type="string"/> 
    <element column="hol_date" type="date"/> 
</map> 

Order-by clause: Made in DBMS and application wide for a particular relation. 
<set name="aliases" table="person_aliases" order-by="lower(name) asc"> 
    <key column="person"/> 
    <element column="name" type="string"/> 
</set> 
0

我认为,有序集合可以帮助你。例如:

@OneToMany() 
@Sort(comparator = SomeComparator.class, type = SortType.COMPARATOR) 
private SortedSet<Item> items= new TreeSet<Item>(SomeComparator.instance()); 

实现您自己的比较器并将其用于排序集。