如何在hibernate中获取可排序的集合

时间:2011-09-30 06:59:31

标签: java hibernate

我们一般在hibernate中使用Sets为一对多和多对多的集合。直到现在,这一直很好。

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

我们的问题是你不能将Collections.sort设置为Set,我们害怕将我们的Set包装在List中,因为这可能会破坏我们的绑定(特别是在父子关系中)。

所以我们考虑在实体中更改所有Set to List(没有索引列),但这看起来很极端,我已经阅读了双向一对多和多对多列表关系的问题。

有什么建议吗?

4 个答案:

答案 0 :(得分:1)

您可以让您的设置对象实现 Comparable<> 界面。

通过这种方式使用 compareTo 功能(您必须实施),您可以指定套装的顺序。

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

答案 1 :(得分:0)

Google Collections有一个ImmutableSortedSet,也许可以提供帮助。

答案 2 :(得分: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>

答案 3 :(得分:0)

我认为排序集可以帮到你。例如:

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

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