Hibernate集合排序之内存排序

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

使用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中对表某个字段排序 Hibernate中对表某个字段排序,直接在配置里面实现排序功能。 立即下载

相关推荐

Hibernate查询结果排序

1.对于一般的查询排序,可以使用HQL语句,例: Student类有两个属性id和name,对应表中的字段分别为id和NName;查询表中的所有记录并按name升序排序 Query q=session.createQuery("from Student order by name asc"); List li=(List)q.list();

jialinqiang的专栏 3万+

Hibernate检索、排序(三)

4、hibernate检索策略        1):立即检索(加载);session.get();query.list();缺点:sql语句太多。    2): 延迟检索(加载);session.load();query.iterate();    3): 在多对一关联级别中,默认情况下是使用左外连接检索策略。如果对Order.hbm.xml        文件中的”true”>表示总是

漂流幻境 1412

Hibernate排序

在查询对象的Set或Map成员时,您可以对其进行排序排序可以在两个层次进行,一个是在Java执行环境中进行,一个是利用数据库本身的排序功能。 Java执行环境中进行排序:---------------------------------如果要在Java执行环境中进行排序,可以映像文件中设定sort属性,例如若为Set,则如下设定: 藉由指定sort为natural,Hiberna

foart的专栏 2771

Java程序员从笨鸟到菜鸟之(五十九)细谈Hibernate(十)hibernate查询排序和组件映射...

上一篇: 细谈Hibernate(九)hibernate一对一关系映射 在实际开发过程中,有很多用户需要时要把查询出来的结果进行排序显示,而不是在数据库里面那样顺序混乱那样的显示,这样的话我们不得不要对数据进行排序了,hibernate对数据排序提供了很好的支持,hibernate提供了两种对查询到得数据结果进行排序:1:数据库排序,也就是说在数据库内部就进行完了排序。2.内存排...

161

Hibernate(2)【sort和order by】排序的区别

在Hiebernate集合映射关系中,排序问题<set name="addresses" table="addresses" *sort="natural"*> <key column="uid" /> <element column="address" type="string" /> </set>sort=”natural”保证了出库排序,而

Renshaoxiong的博客 1316

hibernate 集合排序 一 (内存排序

  内存排序 &lt;set&gt;&lt;map&gt;类似     使用sort属性,我们可以通过在取回结果集后在内存中进行排序,然后返回一个经过排序的结果集合 数据库结构: create table teamSort (id varchar(32),teamname varchar(32)); create table studentSort (name va...

terryjs 161

关于Hibernate内存集合排序的非常棘手的问题

雷并快乐着的专栏 973

Hibernate集合排序

Hibernate集合中的元素支持两种排序方式: Ø 在数据库中排序:简称为数据库排序,当Hibernate通过select语句到数据库中检索集合对象时,利用order by子句进行排序。 Ø 在内存排序:简称为内存排序,当Hibernate把数据库中的集合数据加载到内存中的Java集合中后,利用Java集合排序功能进行排序,可以选择自然排序或者客户化排序两种方式。 在映射...

张飞的IT专栏 198

hibernate中给集合排序的方法

 hibernate中给集合排序的方法 这里我们用set作示例,不讨论map,bag等结构有执行排序的位置,可以分为内存排序和数据库排序,1.内存排序,通过提供一个实现了Comparator接口的排序器来实现配置文件:                            class="com.company.project.domain.system.Menu" />java文件:/

雷并快乐着的专栏 760

Hibernate 集合排序

CRM中Customer遇到的Set属性排序问题 分类: Hibernate2008-07-04 10:32 513人阅读 评论(0) 收藏 举报 crmhibernate数据库annotationsclassmenu 今天在CRM中Customer遇到的Set属性排序问题,后来翻了下孙卫琴的《精通HibernateHibernate中的集合 Hibernate中的集

JackieLiuLixi的专栏 1181

Hibernate之映射集合(有序集合)

Hibernate之映射集合(有序集合)

fhd001的专栏 864

Hibernate Set集合排序

hbm.xml文件中的 转载另一种方式:原文作者的地址是http://yangdaojun.iteye.com/blog/292926,作者名字不知 本文探讨对Hibernate的set集合进行排序。假如有两张表:课程信息表(ECH_LEARN_COURSE)和课程分类信息表(ECH_LEARN_COUCATEGORY),它们之间是一对多的关系。对应的java类分别为EchLe...

李义星 166

[转] hibernate中给集合排序的方法

&lt;iframe style="MARGIN-TOP: 0px; FLOAT: left" border="0" marginwidth="0" framespacing="0" marginheight="0" src="http://wz.csdn.net/vote.aspx?t=hibernate%u4E2D%u7ED9%u96C6%u5408%u6392%u5E8F%u768

从新开始 209
上一篇: 关于 Comparable 和 Comparator
下一篇: 《Hibernate开发及整合大全》一书中的一点小错误
daryl715
博客等级 码龄25年 573粉丝 755原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值