天天看點

Hibernate之Criteria 查詢

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章中介紹有更多的查詢方式。

繼續閱讀