今天在CRM中Customer遇到的Set<Contact>属性排序问题,后来翻了下孙卫琴的《精通Hibernate》 Hibernate中的集合 Hibernate中的集合分为四类: 1.bag类:元素无序,可重复 ------------ 仅支持数据库排序 2.set类:元素无序,不可重复 ------------- 内存排序和数据库排序 3.list类:元素有序,可重复 ------------- 不支持任何排序方式 4.array类:数组 5.map类:映射关系 内存排序和数据库排序 除bag类集合外,其它集合都可以在java api中找到对应的接口类,
bag可以认为对应java中的List
Hibernate中将集合分为2类: 一是值集合,集合中存储的都是基本数据类型,包括String类型,及其它可识别的数据库类型 二是实体集合,集合中存储已经映射了的实体对象,反应对象间的关系。 Hibernate对集合中元素支持两种排序方式: 1.内存排序,通过提供一个实现了Comparator接口的排序器来实现
- 配置文件:
- <set name="children" sort="com.company.project.domain.system.MenuComparator">
- <key>
- <column name="parent_id" not-null="true" />
- </key>
- <one-to-many
- class="com.company.project.domain.system.Menu" />
- </set>
- java文件:
- /**
- * 用来给菜单排序
- *
- * @author wangjian
- *
- */
- public class MenuComparator implements Comparator<Menu> {
- public int compare(Menu m1, Menu m2) {
- return m2.getDisplayPosition() - m1.getDisplayPosition();
- }
- }
- 配置文件:
- <set name="children" order-by="DISPLAY_POSITION desc">
- <key>
- <column name="parent_id" not-null="true" />
- </key>
- <one-to-many
- class="com.company.project.domain.system.Menu" />
- </set>
- 注意:order-by属性完全是sql的语法,比如:字段名士数据库字段名称,不是hql中映射的名称,而且可以提供多个排序字段,默认排序方式是asc(升序)
- 关于集合排序的详细信息,可以参考hibernate官方文档的集合相关章节
- 附Hibernate 3 annotations 中配置:
- <pre name="code" class="java"> /* 该客户的所有联系人
- * OrderBy(value = "birthday DESC")为Hibernate数据库中排序
- * */
- @OneToMany(mappedBy="customer",fetch = FetchType.LAZY,cascade=CascadeType.REMOVE)
- @OrderBy(value = "birthday DESC")
- public Set<Contact> getContacts() {
- return contacts;
- }</pre>