hibernate支持一種java編寫習(xí)慣的查詢api,使用session建立net.sf.hibernate.Criteria,您可以在不用sql甚至hql的情況下進(jìn)行查詢。
如果我們要查詢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設(shè)置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()設(shè)置返回的信息條數(shù),setFirstResult()設(shè)置查詢結(jié)果的初始位置,上面的程序段可以實(shí)現(xiàn)分頁。
在hibernate的Session里面使用createCriteria可以創(chuàng)建一個Criteria實(shí)例幫助我們進(jìn)行條件查詢,不用自己串hql語句,很方便。
用法很簡單,首先傳Class實(shí)例創(chuàng)建Criteria,Class實(shí)例對應(yīng)你想要查詢的那個實(shí)體:
Criteria c = session.createCriteria(Person.class);
然后調(diào)用Criteria的add方法加入條件(Restrictions)。常用的條件有:
方法說明: Restrictions.eq 等于
Restrictions.allEq 使用Map,使用key/value進(jìn)行多個等于的對比
Restrictions.gt 大于 >
Restrictions.ge 大于等于 >=
Restrictions.lt 小于 <
Restrictions.le 小于等于 <=
Restrictions.between 對應(yīng)SQL的BETWEEN子句
Restrictions.like 對應(yīng)SQL的LIKE子句
Restrictions.in 對應(yīng)SQL的in子句
Restrictions.and and關(guān)系
Restrictions.or or關(guān)系
Restrictions.sqlRestriction SQL限定查詢
例如,我想返回Person實(shí)體里面年齡(age)大于20的記錄,那么就為Criteria加入Restrictions.gt條件:
List list = c.add(Restrictions.gt(“age”,new Integer(20))).list();
Restrictions.and和Restrictions.or很有用,表示and查詢還是or查詢,例如我要查詢Person實(shí)體里面年齡(age)大于20,或者性別 (sex)為man
的記錄,那么就為Criteria加入:
List list = c.add(Restrictions.or(
Restrictions.gt(“age”,new Integer(20)),
Restrictions.eq(“sex”,”man”)
)).list();
如果需要關(guān)聯(lián)查詢的話,可以使用Criteria的createCriteria方法創(chuàng)建一個Criteria,例如部門(Department)和人員(Person)是一對多的關(guān)系,我要查詢Person實(shí)體里面年齡(age)大于20,性別 (sex)為man,
備注包含應(yīng)屆生,
且所在部門(department)是開發(fā)部的記錄:
List list = c.add(Restrictions.gt(“age”, new Integer(20)))
.add(Restrictions.eq(“sex”,”man”))
.add(Restrictions.like(“Memo”,”%應(yīng)屆生%”))
.createCriteria(“department”)
.add(Restrictions.eq(“departmentname”,”開發(fā)部”))
.list();
其他條件的用法也很簡單,就不列舉了。
另外,Hibernate3出了一個org.hibernate.criterion.DetachedCriteria,即離線Criteria,它允許你可以先創(chuàng)建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實(shí)例List list = criteria.list();
最后,需要注意,Criteria還提供了setFirstResult和setMaxResults方法進(jìn)行分頁查詢。