在Hibaernate中提供了豐富的檢索(查詢)方式,因為項目中涉及到查詢特别是複雜查詢的時候基本上用的都市iBatis,是以一直都沒怎麼用Hibaernate自帶的查詢方法。總的說來Hibernate有如下集中查詢方式:
1.根據OID檢索某條指定的記錄,典型方法如session.load()和session.get();
2.HQL檢索方式。HQL是Hibernate Query Language的所寫,形式類似SQL語句,隻
不過它是面向對象的,從某種程度上而言,你可以說HQL是面向對象的查詢語句,而SQL是面向關系的查詢語句。使用這種檢索方式的典型方法是session.createQuery(String hql),在Hibernate2.0中還有一個session.find方法也是采用的這種檢索方式,不過已淘汰了;
3.QBC檢索方式。使用Criteria接口的API來檢索對象。它封裝了基于字元串形式的查詢語句,提供了更加面向對象的接口。
4.原生SQL檢索。使用本地資料庫的SQL查詢語句。Hibernate會負責把檢索到的JDBC ResultSet結果集映射為持久化對象圖。典型方法如session.createSQLQuery(String sql);
第一種檢索方式使用的已經很普遍了,而且也十分簡單,下面主要看後三種檢索方式。
一.HQL檢索方式
代碼片段如下:
…………………………………………………………………………………………
Query query=session.createQuery(“from Customer as c where c.name=:name”);
query.setString(“name”,”CMTobby”);
List result=query.list();
一個典型的HQL檢索可以分為3個步驟:
1.建立一個Query類型的對象,它包含一個HQL語句;如上面紅底的代碼,注意from後面跟的是類名而不是表名;
2.動态綁定參數(如果使用了動态參數的話)。動态綁定參數有兩種方式:命名參數綁定和位置參數綁定。上例中采用的命名參數綁定,形式是“冒号:參數名”。還有一種位置參數綁定,如下:
Query query=session.createQuery(“from Customer as c where c.name=?”);
query.setString(0,”CMTobby”);
這個方式同JDBC中的預編譯方式相似。當同時使用命名參數和位置參數時,位置參數必須出現在命名參數之前,否則運作出錯。如下面的代碼:
Query query=session.createQuery(“from Customer as c where c.name=:name and c.sex=?”);
query.setString(0,”F”);
運作時會報錯:cannot define positional parameter after any named parameters have been defined
3.調用list()方法執行查詢語句。
二.QBC檢索方式
Criteria criteria=session.createCriteria(Customer.class);
Criterion criterion1=Expression.eq("sex", "F");
Criterion criterion2=Expression.like("name", "%sb1%");
criteria.add(criterion1);
criteria.add(criterion2);
Result list= criteria.list();
一個典型的QBC可以分為如下幾個步驟:
1.建立一個Criteria類型的對象。上面的紅色代碼所示。這裡我們可以看出QBC是面向對象的,并且顯然不支援多表的聯合查詢,因為它是針對某個持久化類進行的。
2.指定查詢條件,如上面的綠色代碼所示。每一個Criterion類型的對象代表一個查詢條件,把所有的Criterion類型對象增加到Criteria中,Criteria可以看成是一個Criterion的集合,在英文中Criteria就是Criterion的複數形式,是以了解點e文對于我們了解程式還是有幫助的,^_^。指定查詢條件我們使用的是Expression類,它繼承自Restrictions類,它裡面定義了很多設定查詢條件的方法,詳細情況可以看它的API文檔。
三.使用原生SQL檢索(Native SQL)
一個典型的代碼如下所示:
Query query=session.createSQLQuery(“selct * from CUSTOMORS where name=:name”);
這種檢索方式和HQL檢索方式非常類似,隻不過查詢語句的風格不同而已,就不詳細說明了。
本文轉自 646676684 51CTO部落格,原文連結:http://blog.51cto.com/2402766/617211,如需轉載請自行聯系原作者