hbm.xml文件中的<set order-by="这里填写的是数据库字段名,而不是属性名,多个用逗号分隔">
</set>
转载另一种方式:原文作者的地址是http://yangdaojun.iteye.com/blog/292926,作者名字不知
本文探讨对Hibernate的set集合进行排序。假如有两张表:课程信息表(ECH_LEARN_COURSE)和课程分类信息表(ECH_LEARN_COUCATEGORY),它们之间是一对多的关系。对应的java类分别为EchLearnCourse和EchLearnCoucategory。EchLearnCoucategory有一个Set属性 echLearnCourse,需要对echLearnCourse按课程的排序位置(ORDER_NUM)进行排序。首先使用数据库排序:
<set name="echLearnCourses" order-by="ORDER_NUM asc" inverse="true" lazy="true">
<cache usage="read-write"/>
<key>
<column name="CATEGORYID" length="32" not-null="true"/>
</key>
<one-to-many class="cn.echineseblcu.learning.persistence.EchLearnCourse" />
</set>
但输出的集合无序,无奈,用内存排序吧
<set name="echLearnCourses" inverse="true" lazy="true" sort="cn.echineseblcu.learning.persistence.CourseComparator">
<cache usage="read-write" />
<key>
<column name="CATEGORYID" length="32" not-null="true"/>
</key>
<one-to-many class="cn.echineseblcu.learning.persistence.EchLearnCourse" />
</set>
输出的集合依然无序。没辙了,那就用TreeSet试试:
即在映射类中定义相应的TreeSet属性echLearnCoursesTreeSet,让EchLearnCoucategory类实现Comparable接口。在EchLearnCoucategory中定义内部类CourseComparator,将EchLearnCourse 按orderNum排序。
public TreeSet<EchLearnCourse> getEchLearnCoursesTreeSet() {
echLearnCoursesTreeSet.addAll(echLearnCourses);
return echLearnCoursesTreeSet;
}
public class CourseComparator implements Comparator{
public int compare(Object o1,Object o2){
EchLearnCourse c1=(EchLearnCourse)o1;
EchLearnCourse c2=(EchLearnCourse)o2;
if(c1.getOrderNum().compareTo(c2.getOrderNum())>0)
return 1;
if(c1.getOrderNum().compareTo(c2.getOrderNum())<0)
return -1;
return 0;
}
}
输出某分类下的课程时使用echLearnCoursesTreeSet,而不用echLearnCourses。
具体映射文件及java类如下:
课程信息表映射文件及对应的java类:
<!--EchLearnCourse.hbm.xml-->
<hibernate-mapping>
<class name="cn.echineseblcu.learning.persistence.EchLearnCourse" table="ECH_LEARN_COURSE" schema="ECHINESE2">
<cache usage="read-write"/>
<id name="id" type="java.lang.String">
<column name="ID" length="32" />
<generator class="uuid.hex" />
</id>
<many-to-one name="echLearnCoucategory" class="cn.echineseblcu.learning.persistence.EchLearnCoucategory" fetch="select">
<column name="CATEGORYID" length="32" />
</many-to-one>
。。。。。。
</class>
</hibernate-mapping>
<!--EchLearnCourse.java-->
public class EchLearnCourse extends CommonBean implements java.io.Serializable,Comparable {
// Fields
public int compareTo(Object o) {
// TODO Auto-generated method stub
return 0;
}
private EchLearnCoucategory echLearnCoucategory;
。。。。。。
// Constructors
/** default constructor */
public EchLearnCourse() {
}
public EchLearnCourse(String id) {
this.id = id;
}
。。。。。。
public EchLearnCoucategory getEchLearnCoucategory() {
return this.echLearnCoucategory;
}
public void setEchLearnCoucategory(EchLearnCoucategory echLearnCoucategory) {
this.echLearnCoucategory = echLearnCoucategory;
}
。。。。。。
public boolean equals(Object o)
{
return EqualsBuilder.reflectionEquals(this, o);
}
public int hashCode()
{
return HashCodeBuilder.reflectionHashCode(this);
}
}
课程分类信息表映射文件及对应的java类:
<!--EchLearnCoucategory.hbm.xml-->
<hibernate-mapping>
<class name="cn.echineseblcu.learning.persistence.EchLearnCoucategory" table="ECH_LEARN_COUCATEGORY" schema="ECHINESE2">
<cache usage="read-write"/>
<id name="id" type="java.lang.String">
<column name="ID" length="32" />
<generator class="uuid.hex" />
</id>
。。。。。。 //省略若干属性
<set name="echLearnCourses" where="delflag='02'" inverse="true" lazy="true">
<cache usage="read-write"/>
<key>
<column name="CATEGORYID" length="32" not-null="true"/>
</key>
<one-to-many class="cn.echineseblcu.learning.persistence.EchLearnCourse" />
</set>
</class>
</hibernate-mapping>
<!--EchLearnCoucategory.java-->
public class EchLearnCoucategory extends CommonBean implements java.io.Serializable,Comparable {
// Fields
public int compareTo(Object o) {
// TODO Auto-generated method stub
return 0;
}
private Set echLearnCourses = new HashSet(0);
private TreeSet<EchLearnCourse> echLearnCoursesTreeSet = new TreeSet<EchLearnCourse>(new CourseComparator());
private Set echLearnCoucategoryI18ns = new HashSet(0);
// Constructors
/** default constructor */
public EchLearnCoucategory() {
}
。。。。。。//省略若干属性的getter和setter方法
public Set getEchLearnCourses() {
return this.echLearnCourses;
}
public void setEchLearnCourses(Set echLearnCourses) {
this.echLearnCourses = echLearnCourses;
}
public TreeSet<EchLearnCourse> getEchLearnCoursesTreeSet() {
echLearnCoursesTreeSet.addAll(echLearnCourses);
return echLearnCoursesTreeSet;
}
public void setEchLearnCoursesTreeSet(
TreeSet<EchLearnCourse> echLearnCoursesTreeSet) {
this.echLearnCoursesTreeSet = echLearnCoursesTreeSet;
}
public class CourseComparator implements Comparator{
public int compare(Object o1,Object o2){
EchLearnCourse c1=(EchLearnCourse)o1;
EchLearnCourse c2=(EchLearnCourse)o2;
if(c1.getOrderNum().compareTo(c2.getOrderNum())>0)
return 1;
if(c1.getOrderNum().compareTo(c2.getOrderNum())<0)
return -1;
return 0;
}
}
}
分享到:
相关推荐
14.5.1 在数据库中对集合排序 14.5.2 在内存中对集合排序 14.6 映射组件类型集合 14.7 小结 14.8 思考题 第15章 映射实体关联关系 15.1 映射一对一关联 15.1.1 按照外键映射 15.1.2 按照主键映射 ...
1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5. 双向关联 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. ...
1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5. 双向关联 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. ...
1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5. 双向关联 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. ...
6.3.2 排序集合和有序集合 6.3.3 映射嵌入式对象的集合 6.4 映射父/子关系 6.4.1 多样性 6.4.2 最简单的可能关联 6.4.3 使关联双向 6.4.4 级联对象状态 6.5 小结 第7章 高级实体...
集合排序(Sorted Collections) 6.7. 使用<idbag><br>6.8. 双向关联(Bidirectional Associations) 6.9. 三重关联(Ternary Associations) 6.10. 异类关联(Heterogeneous Associations) 6.11. 集合...
1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5. 双向关联 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. ...
1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5. 双向关联 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. ...
单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5. 双向关联 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. 部署...
2.3.2. 一个单向的Set-based关联 2.3.3. 使关联工作 2.3.4. 值类型的集合 2.3.5. 双向关联 2.3.6. 使双向关联工作 2.4. 总结 3. 体系结构(Architecture) 3.1. 概况(Overview) 3.2. 实例状态 3.3. JMX整合 ...
1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5. 双向关联 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. ...
14.5.1 在数据库中对集合排序 14.5.2 在内存中对集合排序 14.6 映射组件类型集合 14.7 小结 14.8 思考题 第15章 映射实体关联关系 15.1 映射一对一关联 15.1.1 按照外键映射 15.1.2 按照主键映射 ...
14.5.1 在数据库中对集合排序 14.5.2 在内存中对集合排序 14.6 映射组件类型集合 14.7 小结 14.8 思考题 第15章 映射实体关联关系 15.1 映射一对一关联 15.1.1 按照外键映射 15.1.2 按照主键映射 ...
14.5.1 在数据库中对集合排序 14.5.2 在内存中对集合排序 14.6 映射组件类型集合 14.7 小结 14.8 思考题 第15章 映射实体关联关系 15.1 映射一对一关联 15.1.1 按照外键映射 15.1.2 按照主键映射 ...
集合排序(Sorted Collections) 6.7. 使用<idbag><br>6.8. 双向关联(Bidirectional Associations) 6.9. 三重关联(Ternary Associations) 6.10. 异类关联(Heterogeneous Associations) 6.11. 集合...
2.3.2. 一个单向的Set-based关联 2.3.3. 使关联工作 2.3.4. 值类型的集合 2.3.5. 双向关联 2.3.6. 使双向关联工作 2.4. 总结 3. 体系结构(Architecture) 3.1. 概况(Overview) 3.2. 实例状态 3.3. JMX...
一个单向的Set-based关联 2.3.3. 使关联工作 2.3.4. 值类型的集合 2.3.5. 双向关联 2.3.6. 使双向关联工作 2.4. 总结 3. 体系结构(Architecture) 3.1. 概况(Overview) 3.2. 实例状态 3.3. JMX整合 ...
1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5. 双向关联 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. ...
94、元素有一个cascade属性,如果希望Hibernate级联保存集合中的对象,casecade属性应该取什么值?(单选)(D) 22 95、以下哪些属于Session的方法?(A,B,C,D,F) 22 96、Hibernate工作原理及为什么要用? 22 97、...