`
yangdaojun
  • 浏览: 23946 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate Set集合排序

阅读更多
本文探讨对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;
    }
}
}
分享到:
评论
10 楼 martinfans 2009-07-10  
不知道你mapping的set的实现是那个set. 如果是HashSet,那么取出的数据是无序的。
具体的请看这里,
http://java.sun.com/developer/JDCTechTips/2002/tt1105.html
9 楼 Allen 2009-01-12  
PO实现Camparable接口,Set使用TreeSet就可以了……
8 楼 wxlmcqueen 2009-01-12  
order by 和 sort配置项 都可以。
没有那么复杂
7 楼 foonyun 2009-01-11  
不会吧,我这样配置都是可以有序的
6 楼 kjj 2009-01-11  
也可用set 需要实现一个comparator 或者指定order by 字段
5 楼 movingboy 2009-01-02  
没错,楼上的解决办法很明了
4 楼 xieboxin 2009-01-02  
其实可不可以配置完:

<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容器改为List容器?

因为set存入时讲速度,不保留顺序,但List保留顺序。
3 楼 nighthawk 2009-01-01  
呵呵,回复比主贴有意思。
这是hibernate中的一种典型的实现set集合映射的排序
2 楼 hantsy 2009-01-01  
呵呵,说实在的不知所云。
Hibernate提供两种方式排序,一是orderby,这个是直接影响SQL,另外可以设置sort,它是对结果集进行排序。
1 楼 kjj 2008-12-31  
一个排序搞这么多代码

相关推荐

    hibernate set 集合映射

    在Java的持久化框架Hibernate中,集合映射是将数据库中的表关系映射到对象模型中的集合类,如List、Set、Map等。这允许我们在Java代码中操作对象集合,而Hibernate负责处理底层的SQL查询和数据存储。本文将深入探讨`...

    hibernate bag 集合映射

    在Hibernate中,集合映射是指将数据库中的表与Java集合对象(如List、Set等)进行关联,方便对一组相关数据进行操作。 "bag"是Hibernate中的一种集合类型,表示无序的、可重复的对象集合。在数据库层面,这通常对应...

    Hibernate集合映射

    集合映射是Hibernate中一个非常关键的概念,它使得Java集合类如List、Set、Map等能够与数据库中的多对一、一对多、多对多关系对应起来。在这个主题中,我们将深入探讨Hibernate集合映射的各个方面。 首先,我们来看...

    day36 06-Hibernate抓取策略:set集合上的抓取策略

    今天我们要探讨的是Hibernate的抓取策略,特别是针对set集合的策略。在大型应用中,有效地管理数据加载能显著提升性能,减少数据库交互次数,这就是抓取策略的核心作用。 首先,我们需要理解什么是抓取策略。在...

    JAVA培训-HIBERNATE的集合映射.doc

    首先,我们来看Set集合映射。Set是不允许重复元素的集合,它的映射在Hibernate中通常使用`&lt;set&gt;`标签来定义。在提供的代码片段中,`Customer`类有一个`Set&lt;Order&gt;`类型的属性`orders`,这表示一个客户可以有多个订单...

    [原]Hibernate集合映射

    9. **集合排序与分页** Hibernate允许我们在集合映射中定义排序规则,使用`@OrderBy`注解指定排序字段和顺序。同时,通过Query对象的`setFirstResult`和`setMaxResults`方法可以实现分页查询。 10. **集合缓存** ...

    hibernate 一对多 set 与 list 分别用法

    - **无序性**:`Set`内部的元素排序由`HashSet`或`TreeSet`等实现决定,通常并不按照插入顺序排列,这在数据一致性上更有优势,但可能不符合某些业务需求。 - **性能**:在数据库层面,`Set`映射通常会导致主键...

    hibernate 集合映射

    Set集合不允许有重复元素,因此在Hibernate中,set映射通常用于表示唯一性关系,如一对多关系。在Hibernate映射文件中,我们可以使用`&lt;set&gt;`标签来配置。例如: ```xml &lt;set name="courses" table="COURSE" ...

    hibernate中的集合映射范例程序

    在Hibernate中,我们通常使用`&lt;set&gt;`标签,它默认按对象的自然排序或自定义比较器排序。例如,一个部门可以有多个员工,员工ID可以作为唯一标识,因此适合用Set。 3. **Map映射**:Map提供了键值对的存储方式。在...

    hibernate 中的 set map list 代码

    本主题主要聚焦于如何利用Hibernate处理集合类型的属性,包括Set、List和Map。这些集合类型的映射允许我们在一个实体类中存储多个相关联的数据项,从而实现一对多或多对多的关系。 首先,Set是不包含重复元素的集合...

    hibernate 3.6 中文 chm

    10. **一对多、多对一、一对一和多对多关系映射**:Hibernate支持多种关联映射,包括集合映射,如List、Set、Map等,以及复合主键的处理。 11. **继承映射**:在Java中,子类可以继承父类。在Hibernate中,这种继承...

    hibernate源码分析过程

    集合映射可以是 set、list、map、bag、array 等。级联策略控制可以控制集合元素的保存和删除。排序策略可以控制集合元素的顺序。 聚合映射 Hibernate 的聚合映射可以将多个对象聚合到一个对象中。聚合映射可以是...

    hibernate教程+3.0API

    10. **集合映射**:Hibernate支持多种集合类型的映射,如List、Set、Map等,方便处理一对多、多对一、多对多的关系。 通过学习《Hibernate教程+3.0 API》,开发者可以全面掌握Hibernate的核心概念和实际应用,从而...

    hibernate中容器映射技术

    在Java持久化框架Hibernate中,容器映射技术是将Java集合类(如Set、Map、List等)与数据库中的关联关系进行映射的一种方法。这种技术使得对象之间的复杂关系能够被有效地存储和检索,增强了数据操作的灵活性。下面...

    韩顺平.2011版.hibernate笔记.zip

    8. 集合映射与关联管理:Hibernate支持多种集合类型的映射,如List、Set、Map等。笔记将阐述如何配置和使用这些集合,以及如何处理一对多、一对一、多对一、多对多的关联关系。 9. 性能优化:最后,笔记会探讨一些...

    hibernate3.2

    10. **集合映射**:在Hibernate 3.2中,可以映射各种类型的集合,如List、Set、Map等,同时支持一对多、多对一、一对一等多种关联关系。 11. **延迟加载(Lazy Loading)**:为了解决性能问题,Hibernate 提供了懒...

    孙卫琴精通hibernate part2

    - Hibernate支持多种关系映射,本章将深入讲解一对一、一对多和多对一的关系配置,包括集合类型的选择(List, Set, Map等)和级联操作的设置。 4. **Chapter 9:多对多关系映射** - 多对多关系在数据库设计中常见...

    hibernate开发与实战 源代码

    3. **Chapter 07 - 组件和集合(Set)**: Hibernate中的组件和集合是面向对象设计的重要概念,它们用于表示复杂的对象关系。此章可能包含关于如何映射和操作组件实体以及使用Set存储关联对象的内容。 4. **Chapter 09...

    hibernate3.3.2中文帮助文档

    9. **集合映射**:Hibernate支持多种类型的集合映射,如List、Set、Map等,以及一对一、一对多、多对多的关联关系映射。 10. **缓存机制**:Hibernate提供了一级缓存和二级缓存,可以提高数据读取速度并减少数据库...

    Hibernate参考指南

    Hibernate支持多种集合类型,如List、Set、Map等。映射集合类时,需要指定元素类型和关联的数据库表。例如,@OneToMany、@ManyToMany表示一对多或多对多关系,@ElementCollection用于映射基本类型的集合。 七、关联...

Global site tag (gtag.js) - Google Analytics