今天在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();
}
}
2.数据库排序,就是执行sql语句的时候利用order by {数据库字段1 数据库字段2...} {asc, desc}来达到目的
配置文件:
<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 中配置:
/* 该客户的所有联系人
* OrderBy(value = "birthday DESC")为Hibernate数据库中排序
* */
@OneToMany(mappedBy="customer",fetch = FetchType.LAZY,cascade=CascadeType.REMOVE)
@OrderBy(value = "birthday DESC")
public Set<Contact> getContacts() {
return contacts;
}