hibernate中Criteria查询
当查询数据时,人们往往需要设置查询条件。在SQL或HQL语句中,查询条件常常放在where子句中。此外,hibernate还支持Criteria查询(CriteriaQuery),这种查询方式把查询条件封装为一个Criteria对象。在实际应用中,使用Session的createCriteria()方法构建一个org.hibernate.Criteria实例,然后把具体的查询条件通过Criteria的add()方法加入到Criteria实例中。这样,程序员可以不使用SQL甚至HQL的情况下进行数据查询,如例程9-1所示。
例程9-1 Criteria应用实例
------------------------------------------------------------------------------------------ Criteria cr = session.createCriteria(Student.class); //生成一个Criteria对象 cr.add(Restrictions.eq("name", "Bill"));//等价于where name=’Bill’ List list = cr.list(); Student stu = (Student)list.get(0); System.out.println(stu.getName()); |
1.常用的查询限制方法
在例程9-1中,Restrictions.eq()方法表示equal,即等于的情况。Restrictions类提供了查询限制机制。它提供了许多方法,以实现查询限制。这些方法及其他一些criteria常用查询限制方法列于表9-1中。
表9-1 Criteria Query常用的查询限制方法
方 法 | 说 明 |
Restrictions.eq() | equal,= |
Restrictions.allEq() | 参数为Map对象,使用key/value进行多个等于的对比,相当于多个Restrictions.eq()的效果 |
Restrictions.gt() | greater-than, > |
Restrictions.lt() | less-than, < |
Restrictions.le() | less-equal, <= |
Restrictions.between() | 对应SQL的between子句 |
Restrictions.like() | 对应SQL的like子句 |
Restrictions.in() | 对应SQL的in子句 |
Restrictions.and() | and关系 |
Restrictions.or() | or关系 |
Restrictions.isNull() | 判断属性是否为空,为空返回true,否则返回false |
Restrictions.isNotNull() | 与Restrictions.isNull()相反 |
Order.asc() | 根据传入的字段进行升序排序 |
Order.desc() | 根据传入的字段进行降序排序 |
MatchMode.EXACT | 字符串精确匹配,相当于“like 'value'” |
MatchMode.ANYWHERE | 字符串在中间位置,相当于“like '%value%'” |
MatchMode.START | 字符串在最前面的位置,相当于“like 'value%'” |
MatchMode.END | 字符串在最后面的位置,相当于“like '%value'” |
例1:查询学生名字以t开头的所有Student对象。
Criteria cr = session.createCriteria(Student.class); cr.add(Restrictions.like(“name”, “t%”)) List list = cr.list(); Student stu = (Student)list.get(0); |
Criteria cr = session.createCriteria(Student.class); cr.add(Restrictions.like(“name”, “t”, MatchMode.START)) List list = cr.list(); Student stu = (Student)list.get(0); |
String[] names = {“Bill”, “Jack”, “Tom”} Criteria cr = session.createCriteria(Student.class); cr.add(Restrictions.in(“name”, names)) List list = cr.list(); Student stu = (Student)list.get(0); |
Criteria cr = session.createCriteria(Student.class); cr.add(Restrictions.eq(“age”, new Integer(22)); cr.add(Restrictions.isNull(“age”)); List list = cr.list(); Student stu = (Student)list.get(0); |
Criteria cr = session.createCriteria(Student.class); cr.add(Restrictions.like(“name”, “F%”); cr.addOrder(Order.asc(“name”)); List list = cr.list(); Student stu = (Student)list.get(0); |
调用Order.asc的方法应是Criteria的addOrder()方法。
2.连接限制
在Criteria 查询中使用FetchMode来实现连接限制。在HQL语句中,可以通过fetch关键字来表示预先抓取(Eager fetching),如下所示:
from Group g left join fetch g.students s where g.name like '%2005' |
Criteria cr = session.createCriteria(Group.class); cr.setFetchMode(“students”, FetchMode.EAGER); cr.add(Restrictions.like(“name”, “2005”, MatchMode.END)) List list = cr.list(); |
select g.*, s.* from Group g left outer join Student s on g.id = s.group_id where g.name like '%2005' |