posts - 30, comments - 5, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

hibernate中Criteria的用法示例

Posted on 2010-05-04 14:07 無所謂 阅读(933) 评论(1)  编辑  收藏 所属分类: Hibernate

hibernate支持一种java编写习惯的查询api,使用session建立net.sf.hibernate.Criteria,您可以在不用sql甚至hql的情况下进行查询。
     如果我们要查询User的所有信息我们可以如下使用Criteria:

Criteria crit = session.createCriteria(User.class);
        List users 
= crit.list();
        
for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) {
            User user 
= (User) iterator.next();
            System.out.println(
"name: " + user.getName());
            System.out.println(
"age: " + user.getAge());           
        }


我们要为查询限定条件,可以通过net.sf.hibernate.expression.Expression设置Expression有很多的条件查询方法下面举一些例子:

Criteria crit = session.createCriteria(User.class);
        crit.add(Expression.ge(
"age"new Integer(25)));
        List users 
= crit.list();


ge()表示大于等于,即age大于等于25的user。

crit.add(Expression.gt("age"new Integer(20)));
crit.add(Expression.between(
"weight"new Integer(60),new Integer(80)));
List users 
= crit.list();


between表示weight在60和80之间。

crit.add(Expression.or(
                   Expression.eq(
"age"new Integer(20)),
                   Expression.isNull(
"age")
               ));
List users 
= crit.list();


eq表示age为20的user。

Criteria crit = session.createCriteria(User.class);
crit.setFirstResult(
51);
crit.setMaxResult(
50);
List users 
= crit.list();

 

setMaxResult()设置返回的信息条数,setFirstResult()设置查询结果的初始位置,上面的程序段可以实现分页。

 

在hibernate的Session里面使用createCriteria可以创建一个Criteria实例帮助我们进行条件查询,不用自己串hql语句,很方便。
用法很简单,首先传Class实例创建Criteria,Class实例对应你想要查询的那个实体:

Criteria c = session.createCriteria(Person.class);


然后调用Criteria的add方法加入条件(Restrictions)。常用的条件有:
 
方法说明: Restrictions.eq 等于 
                     Restrictions.allEq 使用Map,使用key/value进行多个等于的对比
                     Restrictions.gt 大于 >
                     Restrictions.ge 大于等于 >=
                     Restrictions.lt 小于 <
                    Restrictions.le 小于等于 <=
                    Restrictions.between 对应SQL的BETWEEN子句
                    Restrictions.like 对应SQL的LIKE子句
                    Restrictions.in 对应SQL的in子句
                    Restrictions.and   and关系
                     Restrictions.or   or关系
                   Restrictions.sqlRestriction    SQL限定查詢 


例如,我想返回Person实体里面年龄(age)大于20的记录,那么就为Criteria加入Restrictions.gt条件:

List list = c.add(Restrictions.gt(“age”,new Integer(20))).list();


 
Restrictions.and和Restrictions.or很有用,表示and查询还是or查询,例如我要查询Person实体里面年龄(age)大于20,或者性别 (sex)为man
的记录,那么就为Criteria加入:

List list = c.add(Restrictions.or(
Restrictions.gt(“age”,
new Integer(20)),
Restrictions.eq(“sex”,”man”)
)).list();
 


如果需要关联查询的话,可以使用Criteria的createCriteria方法创建一个Criteria,例如部门(Department)和人员(Person)是一对多的关系,我要查询Person实体里面年龄(age)大于20,性别 (sex)为man,
备注包含应届生,
且所在部门(department)是开发部的记录:

List list = c.add(Restrictions.gt(“age”,  new Integer(20)))
.add(Restrictions.eq(“sex”,”man”))
.add(Restrictions.like(“Memo”,”
%应届生%”))
.createCriteria(“department”)
.add(Restrictions.eq(“departmentname”,”开发部”))
.list();


 
其他条件的用法也很简单,就不列举了。
 
另外,Hibernate3出了一个org.hibernate.criterion.DetachedCriteria,即离线Criteria,它允许你可以先创建DetachedCriteria,然后传到Session里面才真正返回一个Criteria,用法如下:

 
DetachedCriteria detchedCriteria 
= DetachedCriteria.forClass(Person.class); // 先建立DetchedCriteria物件
detchedCriteria.add(Restrictions.ge("age",new Integer(25)));    // 加入查询条件
Session session = sessionFactory.openSession();
Criteria criteria 
= detchedCriteria.getExecutableCriteria(session);    // 绑定Session並返回一个Criteria实例List list = criteria.list(); 


 
 
最后,需要注意,Criteria还提供了setFirstResult和setMaxResults方法进行分页查询。
 


评论

# re: hibernate中Criteria的用法示例[未登录]  回复  更多评论   

2010-05-04 22:42 by fw
Expression和Restrictions的区别呢?

只有注册用户登录后才能发表评论。


网站导航: