用法很简单,首先传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,用法如下:
// 先建立DetchedCriteria物件
DetachedCriteria detchedCriteria = DetachedCriteria.forClass(Person.class);
// 加入查詢條件
detchedCriteria.add(Restrictions.ge("age",new Integer(25)));
Session session = sessionFactory.openSession();
// 綁定Session並返回一個Criteria實例
Criteria criteria = detchedCriteria.getExecutableCriteria(session);
List list = criteria.list();
最后,需要注意,Criteria还提供了setFirstResult和setMaxResults方法进行分页查询。