Hibernate透过Comparator接口自定义排序规则
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接口的类
这里的排序是首先对两个学生的卡号进行对比,如果卡号不同,则返回对比结果。
但是如果卡号一样,那么就对比名字,返回名字的对比结果。
要使用该Comparator,必须在映射配置文件里配置一下。
查询代码:
这里数据库里面有三行数据,分别是
id_card name
333 alleni
111 eline
222 222
最后的输出结果就是:
eline,222,alleni
也就是会通过对比id_card来进行排序。
============================
异常:
这里插入数据时会报错。
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接口才行。 具体以后再研究。
摘自圣思园 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接口才行。 具体以后再研究。