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

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

上一节讲到了如何通过设置映射文件属性来实现内存排序,[url]http://alleni123.iteye.com/admin/blogs/1979812[/url]
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();


[color=red]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)[/color]


貌似要让Student.java类实现Comparable接口才行。 具体以后再研究。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值