Criteria 查詢
Hibernate支援一種符合Java撰寫習慣的查詢API,使用Session建立一個net.sf.hibernate.Criteria,您可以在不使用SQL甚至HQL的情況下進行對資料庫的查詢。
我們以之前所練習過的第一個Hibernate程式完成的結果為例:
入門 02 - 第一個Hibernate程式
如果要使用Criteria來查詢所有的User資料,則如下撰寫:
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();
Expression的ge()方法即great-equal,也就是大于等于(>=),在上例中我們設定查詢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();
上例中我們查詢age大于20,而weight介于60到80之間的User。
您也可以使用邏輯組合來進行查詢,例如:
crit.add(Expression.or(
Expression.eq("age", new Integer(20)),
Expression.isNull("age")
));
List users = crit.list();
如果要對結果進行排序,可以使用net.sf.hibernate.expression.Order,例如:
List cats = session.createCriteria(User.class)
.add(Expression.ge("age", new Integer(20));
.addOrder( Order.asc("name") )
.addOrder( Order.desc("age") )
.setMaxResults(50)
.list();
setMaxResults()方法可以限定查詢回來的筆數,如果配合setFirstResult()設定傳回查詢結果第一筆資料的位置,就可以實作簡單的分頁,例如:
Criteria crit = session.createCriteria(User.class);
crit.setFirstResult(51);
crit.setMaxResult(50);
List users = crit.list();
上面的例子将傳回第51筆之後的資料(51到100)。
實際上,Criteria、Expression、Order等是對SQL進行了封裝,讓Java程式設計人員可以用自已習慣的文法來撰寫查詢,而不用使用HQL或SQL(有興趣的話,可以在組态檔案中設定顯示SQL,看看對應的SQL),然而Criteria在Hibernate中功能還不是很完美,隻能實作一些較為簡單的查詢,對于查詢,Hibernate仍鼓勵使用HQL作為查詢的首選方式。
Criteria的使用相當簡單,這邊隻介紹一些基本,有興趣的話,在Hibernate參考手冊的第12章中介紹有更多的查詢方式。