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

Hibernate集合排序之内存排序

阅读更多

使用sort属性,我们可以通过在取回结果集后在内存中进行排序,然后返回一个经过排序的结果集合

数据库结构:

 

create table teamSort (id varchar(32),teamname varchar(32));
create table studentSort (name varchar(32),team_id varchar(32));
insert into teamSort values("1","team1");
insert into studentSort values("a","1");
insert into studentSort values("b","1");
insert into studentSort values("c","1");

 

pojo: student部分采用set集合,无实体类

 

package Collection.Sort;

import java.util.Set;

public class Team ...{
   
private String id;
   
private String teamname;
   
private Set students;
public String getId() ...{
    
return id;
}

public void setId(String id) ...{
    
this.id = id;
}

public String getTeamname() ...{
    
return teamname;
}

public void setTeamname(String teamname) ...{
    
this.teamname = teamname;
}

public Set getStudents() ...{
    
return students;
}

public void setStudents(Set students) ...{
    
this.students = students;
}


}

Team.hbm.xml

 

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<!-- 
    Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
<class name="Collection.Sort.Team" table="teamSort" >
    
<id name="id" unsaved-value="null">
      
<generator class="uuid.hex"></generator>
    
</id>
    
<property name="teamname" type="string" column="teamname"></property>
    
<!-- 以element内容升序返回 -->
    
<set name="students" table="studentSort" cascade="all" sort="natural">
      
<key column="team_id"></key>
      
<element type="string" column="name"></element>
    
</set>
</class>

</hibernate-mapping>

Hibernate.cfg.xml

 

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"
>

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

<session-factory>
    
<property name="connection.username">root</property>
    
<property name="connection.url">
        jdbc:mysql://localhost:3306/schoolproject?characterEncoding=gb2312
&amp;useUnicode=true
    
</property>
    
<property name="dialect">
        org.hibernate.dialect.MySQLDialect
    
</property>
    
<property name="myeclipse.connection.profile">mysql</property>
    
<property name="connection.password">1234</property>
    
<property name="connection.driver_class">
        com.mysql.jdbc.Driver
    
</property>
    
<property name="hibernate.dialect">
        org.hibernate.dialect.MySQLDialect
    
</property>
    
<property name="hibernate.show_sql">true</property>
    
<property name="current_session_context_class">thread</property>
    
<property name="jdbc.batch_size">15</property>
    
<mapping resource="Collection/Sort/Team.hbm.xml" />




</session-factory>

</hibernate-configuration>

测试代码:

 

package Collection.Sort;


import java.io.File;
import java.util.Iterator;
import java.util.Set;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class Test ...{


    
public static void main(String[] args) ...{

        String filePath
=System.getProperty("user.dir")+File.separator+"src/Collection/Sort"+File.separator+"hibernate.cfg.xml";
        File file
=new File(filePath);
        System.out.println(filePath);
        SessionFactory sessionFactory
=new Configuration().configure(file).buildSessionFactory();
        Session session
=sessionFactory.openSession();
        Transaction t
=session.beginTransaction();
        
        Team team
=(Team)session.createQuery("from Team t where t.teamname='team1'").uniqueResult();
        Set result
=team.getStudents();
        Iterator iter
=result.iterator();
        
while(iter.hasNext())...{
            System.out.println(iter.next());
        }

        
        t.commit();
        
    }


}

运行结果:

Hibernate: select team0_.id as id0_, team0_.teamname as teamname0_ from teamSort team0_ where team0_.teamname='team1'
Hibernate: select students0_.team_id as team1_0_, students0_.name as name0_ from studentSort students0_ where students0_.team_id=?
a
b
c

sort="natural"默认进行升序排列,如果我们想改成降序,则需要写一个类实现Comparator接口如下:

 

package Collection.Sort;

import java.util.Comparator;

public class Compare implements Comparator ...{

    
public int compare(Object o1, Object o2) ...{
        String s1
=(String)o1;
        String s2
=(String)o2;
        
if(s1.equals(s2))...{
            
return 0;
        }

        
else if(s1.compareTo(s2)>0)...{
            
return -1;
        }

        
else...{
            
return 1;
        }

    
    }


}

 

然后更改Team.hbm.xml 配置sort属性

sort="Collection.Sort.Compare"

重新执行测试代码,结果如下:

Hibernate: select team0_.id as id0_, team0_.teamname as teamname0_ from teamSort team0_ where team0_.teamname='team1'
Hibernate: select students0_.team_id as team1_0_, students0_.name as name0_ from studentSort students0_ where students0_.team_id=?
c
b
a

 

注意:如果有Student实体类,并set中使用one-to-many或many-to-many标签,则比如使用sort="一个实现comparator接口的类"这样排序

 

分享到:
评论

相关推荐

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     14.5.2 在内存中对集合排序  14.6 映射组件类型集合  14.7 小结  14.8 思考题 第15章 映射实体关联关系  15.1 映射一对一关联  15.1.1 按照外键映射   15.1.2 按照主键映射  15.2 映射单向多对多关联  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     14.5.2 在内存中对集合排序  14.6 映射组件类型集合  14.7 小结  14.8 思考题 第15章 映射实体关联关系  15.1 映射一对一关联  15.1.1 按照外键映射   15.1.2 按照主键映射  15.2 映射单向多对多关联  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     14.5.2 在内存中对集合排序  14.6 映射组件类型集合  14.7 小结  14.8 思考题 第15章 映射实体关联关系  15.1 映射一对一关联  15.1.1 按照外键映射   15.1.2 按照主键映射  15.2 映射单向多对多关联  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     14.5.2 在内存中对集合排序  14.6 映射组件类型集合  14.7 小结  14.8 思考题 第15章 映射实体关联关系  15.1 映射一对一关联  15.1.1 按照外键映射   15.1.2 按照主键映射  15.2 映射单向多对多关联  ...

    并发编程面试题以及答案.docx

    * 集合类:ArrayList、LinkedList、HashSet 等,各自的特点、实现和应用场景。 * 内存溢出:概念、原因、解决方法等。 * == 和 equals 的区别:概念、应用场景和实现。 * hashCode 方法的作用:概念、应用场景和实现...

    java面试题

    25. 集合类都有哪些?主要方法? 14 26. 简述逻辑操作(&,|,^)与条件操作(&&,||)的区别。 14 27. XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 14 28. JSP和Servlet有哪些相同点和不同点...

    java学习手册

    4,java 进阶模块,在java基础内容上进一步详细介绍了多线程,集合框架,以及JVM内存管理,并收录java中容易使人迷惑的谜题内容。 5,数据库模块,完整详尽的介绍了数据库的创建、增删改、检索、常用函数、索引与...

    最新Java面试宝典pdf版

    16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 123 17.介绍一下Hibernate的二级缓存 123 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message ...

    Java面试宝典2010版

    16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 17.介绍一下Hibernate的二级缓存 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message 属性, ...

    Java面试笔试资料大全

    16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 123 17.介绍一下Hibernate的二级缓存 123 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message ...

    JAVA面试宝典2010

    16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 123 17.介绍一下Hibernate的二级缓存 123 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message ...

    Java面试宝典-经典

    16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 123 17.介绍一下Hibernate的二级缓存 123 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message ...

    java面试题大全(2012版)

    16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 123 17.介绍一下Hibernate的二级缓存 123 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message ...

    Java面试宝典2012版

    16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 123 17.介绍一下Hibernate的二级缓存 123 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message...

    java面试宝典2012

    16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 135 17.介绍一下Hibernate的二级缓存 135 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message ...

    Java面试宝典2012新版

    16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 123 17.介绍一下Hibernate的二级缓存 123 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message ...

    飞秋java源码-interviewNote:面试笔记

     排序算法、动态规划、递归、回溯法、贪心算法等。 二、Java Java 基础概念  基本概念、面相对象、关键字、基本数据类型与运算、字符串与数组、异常处理、Object通用方法 Java 集合框架  数据结构 & 源码分析:...

Global site tag (gtag.js) - Google Analytics