hibernate中Criteria查询

来源:互联网 发布:新兴重工查知的老婆 编辑:程序博客网 时间:2024/05/21 10:42

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);
例2:查询学生姓名在Bill, Jack和Tom之间的所有Student对象。
 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);
例3:查询学生的年龄age等于22或age为空(null)的所有Student对象。
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);
例4:查询学生姓名以字母F开头的所有Student对象,并按姓名升序排序。
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 gleft join fetch g.students swhere g.name like '%2005'
可以使用Criteria的API完成同样的功能,如下所示:
Criteria cr = session.createCriteria(Group.class);cr.setFetchMode(“students”, FetchMode.EAGER);cr.add(Restrictions.like(“name”, “2005”, MatchMode.END))List list = cr.list();
以上两种方式编写的代码,都使用相同的SQL语句完成它们的功能,如下所示:
select g.*, s.* from Group gleft outer join Student son g.id = s.group_idwhere g.name like '%2005'