`

Hibernate通过Comparator接口自定义排序规则

阅读更多
摘自圣思园 Hibernate25.自定义内存排序器详解及符合主键映射详解

上一节讲到了如何通过设置映射文件属性来实现内存排序,http://alleni123.iteye.com/admin/blogs/1979812
natural->自然排序,升序
unsorted->不排序

此外,我们可以自定义排序规则。方法是定义一个类,让其实现Comparator接口,并且实现该接口中的compare方法,在该方法中实现排序规则即可。
然后将该自定义排序规则的类名作为sort的属性值即可。


配置文件和前几节一样, Student.java, Team.java, Student.hbm.xml,Team.hbm.xml。

首先要创建一个继承Comparator接口的类

public class MyComparator implements Comparator<Student>
{

	@Override
	public int compare(Student o1, Student o2)
	{
		if(o1==o2){
		return 0;
		}
		
		
		int result=o1.getCardId().compareTo(o2.getCardId());
		
		if(result!=0){
			return result;
		}
		
		return o1.getName().compareTo(o2.getName());
	}

}


这里的排序是首先对两个学生的卡号进行对比,如果卡号不同,则返回对比结果。
但是如果卡号一样,那么就对比名字,返回名字的对比结果。

要使用该Comparator,必须在映射配置文件里配置一下。


<hibernate-mapping package="set_compare">
	<class name="Team" table="test_team">

		<id name="id" column="id" type="string">
			<generator class="uuid">
			</generator>
		</id>

		 
		<property name="name" column="name" type="string" />
		 
		 
		 
		 <set name="students" table="test_student" sort="set_compare.MyComparator">
<!--这里不能只写MyComparator,否则Hibernate会报错。-->
		 
		 <key column="team_id"></key>
		 
		 <one-to-many class="Student"/>
		 
		 
		 </set>
		  
		 
	</class>



</hibernate-mapping>



查询代码:
	Session session=HibernateUtil.openSession();
		
		
		Team t=(Team) session.get(Team.class, "4028bd81428f34c201428f34c4e90000");
		Set s=t.getStudents();
		System.out.println(s.size());
		
		System.out.println(t.getName());
		
		Iterator it=s.iterator();
		
		while(it.hasNext()){
			System.out.println(((Student)it.next()).getName());
		}
		



这里数据库里面有三行数据,分别是
id_card    name
333         alleni
111         eline
222          222

最后的输出结果就是:
eline,222,alleni

也就是会通过对比id_card来进行排序。





============================
异常:

这里插入数据时会报错。

		Session session=HibernateUtil.openSession();
		
  		Transaction tx=session.beginTransaction();
 	 
 		Team team=new Team();
 		
 		
 		
 		team.setName("english");
 		
 		team.setStudents(new TreeSet());
		Set set=team.getStudents();
		 
	    Student s1=new Student(null,"111","alleni",23,team);
		
		
		Student s2=new Student(null,"222","eline",23,team);
		
		Student s3=new Student(null,"333","3333",23,team);
		
		set.add(s1);
		set.add(s2);
		set.add(s3);
		
		
		
		session.save(team);
		
		tx.commit();


Exception in thread "main" java.lang.ClassCastException: set_compare.Student cannot be cast to java.lang.Comparable
at java.util.TreeMap.put(TreeMap.java:542)
at java.util.TreeSet.add(TreeSet.java:238)
at set_compare.Hibernate_1Insert.main(Hibernate_1Insert.java:38)



貌似要让Student.java类实现Comparable接口才行。 具体以后再研究。
分享到:
评论

相关推荐

    解决Hibernate中MySQL的中文排序

    在Hibernate中,可以通过实现`Comparator`接口并覆盖`compare()`方法来自定义比较逻辑,然后在查询时传递这个比较器。例如: ```java public class GbkOrderComparator implements Comparator&lt;String&gt; { @Override ...

    Hibernate一对多多对多查询的排序.doc

    为了自定义排序规则,你需要创建一个实现了`Comparator`接口的类,例如`FlowInfoComparator`,并在其中重写`compare()`方法,根据需要比较的字段进行排序。然后在Hibernate的映射文件中,为`&lt;set&gt;`标签添加`sort`...

    面试角度诠释Java工程师

    Comparator接口用于自定义比较规则,Comparable接口实现对象的自然排序。 再者,Java的IO流系统是处理输入输出的关键。字节流按字节读写,例如FileInputStream和FileOutputStream,操作文件时必须注意关闭流,防止...

    JQuery的启发-教你如何二次处理及优化IBatis和Hibernate的查询结果集

    在IT行业中,数据库操作是应用开发的核心部分,而IBatis和Hibernate作为两个流行的ORM(对象关系映射)框架,极大地...通过创建自定义的工具类,我们可以更好地管理和操作查询结果,同时利用延迟加载等策略来优化性能。

    2016面试汇总.doc

    如果需要自定义排序规则,可以实现`Comparable`接口或使用`Comparator`。 11. **Hibernate的XML配置**: Hibernate配置包括主配置文件`hibernate.cfg.xml`,定义数据源、JDBC连接参数等。实体映射文件(如`XXX.hbm...

    java程序各种常用方法集锦

    - 自定义比较器:通过实现`Comparator`接口,可以自定义排序规则。 3. **分页处理**: - 分页查询通常涉及到数据库操作,可以使用JDBC的`Statement`或`PreparedStatement`进行分页查询,或者使用ORM框架如...

    JAVA面试笔试题

    2. **Comparator接口**:用于自定义对象的排序规则。 **详细解析:** 在Java中,为了方便对自定义对象进行排序,可以使用`Comparable`接口或`Comparator`接口。这里以`Comparator`为例进行说明。 假设有一个`...

    Java项目经验.docx

    迭代器(Iterator)用于遍历集合,而equals和hashCode方法用于对象比较,Comparable和Comparator接口则用于自定义排序规则。 反射机制允许程序在运行时动态地获取类的信息并调用其方法。Class类、Method类、Field类是...

    详解Java的Hibernate框架中的set映射集与SortedSet映射

    如果集合中的对象没有自然顺序,那么需要实现`Comparable`接口或者在映射中指定`comparator`属性来指定排序规则。 如果在`Employee`类中,我们希望证书按照某种顺序(比如证书名称的字母顺序)存储,我们可以将`...

    阿里巴巴校园招聘面试试题合集总结.docx

    - 如果ArrayList中存储的是Person对象,可以通过Collections.sort()方法结合Comparator接口,自定义比较规则按年龄排序。 4. **HashMap的键值要求** - HashMap的键必须是不可变的,且必须实现hashCode()和equals...

    E3tree开发文档

    - `comparator`: 用于对树节点进行排序的比较器,实现java.util.Comparator接口。 - `sortProperty`: 排序属性名称,默认按照节点名称排序,如果需要使用其他属性排序,可以设置此值。 - `reverse`: 是否反向排序,...

    IT名企JavaEE面试题最新整理(附答案)

    Java类的排序:实现Comparable或Comparator接口可使Java类对象进行排序。 Thread类的sleep()与Object类的wait()的区别:sleep()是Thread的静态方法,不会释放锁,而wait()是Object的方法,调用后会释放对象的锁。 ...

    DataSet for JAVA

    在Java中,我们可以通过构建自定义的类来实现类似DataSet的功能,比如包含多个DataTable(在Java中可能称为Table或Record),每个DataTable则由多个DataRow(Record)组成,这些DataRow包含了列名和对应的值。...

    javamianshi.rar_java 试题_java 面试_java 面试题_java面试_面试

    3. 排序与比较:掌握Collections.sort()方法,以及Comparable和Comparator接口的应用。 三、多线程 1. 线程创建:通过Thread类和Runnable接口创建线程。 2. 线程同步:理解synchronized关键字,wait()、notify()和...

    product-price-comparator:产品价格比较器

    同时,对数据进行排序(如按价格升序或降序排列)则需要使用到排序算法,如快速排序、归并排序等。 4. **多线程**:为了提高效率,价格抓取可能会实现多线程或者异步处理。Java提供了丰富的并发控制机制,如`...

    详解Java的Hibernat框架中的Map映射与SortedMap映射

    尽管Hibernate默认不保证Map的排序,但你可以通过自定义Comparator或使用自然排序来实现。配置方式与普通Map相似,只是在Java代码中需要使用SortedMap子类,并确保在映射文件中指定排序规则。 ```java private ...

    Java面试笔试大集合

    3. **集合框架**:ArrayList、LinkedList、HashSet、HashMap等容器的使用及其原理,以及泛型、迭代器、Comparable与Comparator接口的应用。 4. **多线程**:线程的创建方式(Thread类和Runnable接口),同步机制...

    E3Tree开发文档

    - **comparator**: 排序器,用于对树节点进行排序。节点类型为`net.jcreate.e3.tree.support.WebTreeNode`。 - **sortProperty**: 排序属性名称,默认按节点名称排序。如果业务对象具有排序属性,则需指定该属性名,...

    java面试必问题大部份含有答案

    - **TreeSet**基于红黑树实现,自然排序或根据提供的Comparator排序,时间复杂度为O(log n)。 #### 15. JavaScript与Java的区别 - **JavaScript**是一种运行在浏览器上的脚本语言,主要用于网页交互。 - **Java**...

    Java 实现 ADO.NET DataTable

    - `sort(Comparator&lt;Row&gt; comparator)`: 对行进行排序。 - `aggregate(AggregateFunction, T&gt; function)`: 应用聚合函数,如求和、平均值等。 5. **文件操作**: 提供读写数据到文件的功能,可以使用XML序列化...

Global site tag (gtag.js) - Google Analytics