我们一般在hibernate中使用Sets为一对多和多对多的集合。直到现在,这一直很好。
但是现在我们需要越来越多地在控制器层对子集合进行内存中排序,因为不同的视图需要以不同的顺序查看子集合。我们不能仅仅在适用于我们所有观点的实体声明中指定一个订单。
我们的问题是你不能将Collections.sort设置为Set,我们害怕将我们的Set包装在List中,因为这可能会破坏我们的绑定(特别是在父子关系中)。
所以我们考虑在实体中更改所有Set to List(没有索引列),但这看起来很极端,我已经阅读了双向一对多和多对多列表关系的问题。
有什么建议吗?
答案 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());
实现自己的比较器并将其用于排序集。