轉 關於查詢語句

Hibernate檢索對象方式(查詢一)
字號 [ ]

Hibernate檢索對象方式
教學內容
HQL檢索方式
QBC檢索方式
本地SQL檢索方式

Hibernate提供檢索對象方式
導航對象圖檢索方式
根據已經加載對象,導航到其他對象。例如,對於已經加載Customer對象,調用它getOrders().iterator()方法就可以導航到所有關聯Order對象,假如在關聯級別使用了延遲加載檢索策略,那麼首次執行此方法時,Hibernate會從數據庫中加載關聯Order對象,否則就從緩存中取得Order對象。
OID檢索方式
按照對象OID來檢索對象。Sessionget()和load()方法提供了這種功能。如果在應用程序中事先知道了OID,就可以使用這種檢索對象方式。
HQL檢索方式
使用面向對象HQL查詢語言。Sessionfind()方法用於執行HQL查詢語句。此外,Hibernate還提供了Query接口,它是Hibernate提供專門HQL查詢接口,能夠執行各種複雜HQL查詢語句。本章有時把HQL檢索方式簡稱爲HQL。
QBC檢索方式
使用QBC(Query By Criteria)API來檢索對象。這種API封裝了基於字符串形式查詢語句,提供了更加面向對象接口。本章有時把QBC檢索方式簡稱爲QBC。
本地SQL檢索方式
使用本地數據庫SQL查詢語句。Hibernate會負責把檢索到JDBC ResultSet結果集映射爲持久化對象圖。

HQL檢索方式
HQL(Hibernate Query Language)是面向對象查詢語言,它和SQL查詢語言有些相似。在Hibernate提供各種檢索方式中,HQL是使用最廣一種檢索方式。它具有以下功能:
在查詢語句中設定各種查詢條件
支持投影查詢,即僅檢索出對象部分屬性
支持分頁查詢
支持連接查詢
支持分組查詢,允許使用having和group by關鍵字
提供內置聚集函數,如sum()、min()和max()
能夠調用用戶定義SQL函數
支持子查詢,即嵌入式查詢
支持動態綁定參數
Sessionfind()方法以及Query接口
Session類find()方法以及Query接口都支持HQL檢索方式。
這兩者區別在於,前者只是執行一些簡單HQL查詢語句便捷方法,它不具有動態綁定參數功能,而且在Hibernate3.x版本中,已經淘汰了find()方法;而Query接口才是真正HQL查詢接口,它提供了以上列出各種查詢功能。
HQL檢索步驟
 //創建一個Query對象
Query query=session.createQuery("from Customer as c where "
    +" c.name=:customerName "
    +"and c.age=:customerAge");
//動態綁定參數
query.setString("customerName","Tom");
query.setInteger("customerAge",21);
//執行查詢語句,返回查詢結果
List result= query.list();
HQL檢索步驟
 (1)通過SessioncreateQuery()方法創建一個Query對象,它包含一個HQL查詢語句。HQL查詢語句可以包含命名參數,如“customerName”和“customerAge”都是命名參數。
(2)動態綁定參數。Query接口提供了給各種類型命名參數賦值方法,例如setString()方法用於爲字符串類型customerName命名參數賦值。
(3)調用Querylist()方法執行查詢語句。該方法返回List類型查詢結果,在List集合中存放了符合查詢條件持久化對象。
方法鏈編程風格
 List result=session.createQuery("……")
.setString("customerName","Tom")
.setInteger("customerAge",21)
.list(); 
方法鏈編程風格能使程序代碼更加簡潔。
QBC檢索方式
採用HQL檢索方式時,在應用程序中需要定義基於字符串形式HQL查詢語句。
QBC API 提供了檢索對象另一種方式,它主要由Criteria接口、Criterion接口和Expression類組成,它支持在運行時動態生成查詢語句。
QBC檢索方式
//創建一個Criteria對象
Criteria criteria=session.createCriteria(Customer.class);
//設定查詢條件,然後把查詢條件加入到Criteria中
Criterion criterion1= Expression.like("name", "T%") ;
Criterion criterion2= Expression.eq("age", new Integer(21)) ;
criteria=criteria.add(criterion1);
criteria=criteria.add(criterion2);
//執行查詢語句,返回查詢結果
List result=criteria.list();
QBC檢索步驟
(1)調用SessioncreateCriteria()方法創建一個Criteria對象。
(2)設定查詢條件。Expression類提供了一系列用於設定查詢條件靜態方法,這些靜態方法都返回Criterion實例,每個Criterion實例代表一個查詢條件。Criteriaadd()方法用於加入查詢條件。
(3)調用Criterialist()方法執行查詢語句。該方法返回List類型查詢結果,在List集合中存放了符合查詢條件持久化對象。對於以上程序代碼,當運行Criterialist()方法時,Hibernate執行SQL查詢語句爲:
    select * from CUSTOMERS where NAME like 'T%' and AGE=21;

方法鏈編程風格
List result=session.createCriteria(Customer.class)
    .add(Expression.like("name", "T%")
    .add(Expression.eq("age", newInteger(21))
    .list();


比較運算(大於)
List list = session.createQuery("from Hx c where c.id>0")
.list();
List list = session.createCriteria(Hx.class)
.add(Expression.gt("id", new Integer(0)))
 .list();
比較運算(不等於)
List list = session.createQuery("from Hx c where c.id<>0")
.list();

List list = session.createCriteria(Hx.class)
.add(Expression.not(Expression.eq("name", "zmx")))
.list();
比較運算(不等)
List list = session.createQuery("from Hx c where c.name is null")
.list();
List list = session.createCriteria(Hx.class)
.add(Expression.not(Expression.isNull("name")))
.list();
比較運算(範圍)
List list = session.createQuery("from Hx c where c.name in(‘zmx’)")
.list();
String names[]={“zmx”,”hx”};
List list = session.createCriteria(Hx.class)
.add(Expression.in(“name”,names))
.list();
模糊查詢
List list = session.createQuery("from Hx c where c.name like ‘Z%’")
.list();
List list = session.createCriteria(Hx.class)
.add(Expression.like(“name”,”Z%”)))
.list();

QBE查詢(query by Example)
它是QBC子功能,允許創建一個對象模板,然後檢索出所有和模板相同對象,但功能不是很強大,且只支持=和like運算符
   Hx hx = new Hx();
   hx.setAge(33);
   List list = session.createCriteria(Hx.class)
       .add(Example.create(hx)).list();
查詢排序
HQL方式
List list = session.createQuery("from Hx c order by c.name")
            .list();

QBC方式
List list = session.createCriteria(Hx.class)
            .add(Expression.like("name","z%"))
            .addOrder(Order.desc("name"))
            .list();
分頁查詢
 Query和Criteria接口都提供了用於分頁顯示查詢結果方法
setFirstResult(int firstResult):設定從哪一個對象開始檢索,參數firstResult表示這個對象在查詢結果中索引位置,索引位置起始值爲0。默認情況下,Query和Criteria接口從查詢結果中第一個對象,也就是索引位置爲0對象開始檢索。
setMaxResult(int maxResults):設定一次最多檢索出對象數目。默認情況下,Query和Criteria接口檢索出查詢結果中所有對象。

分頁查詢
//採用HQL檢索方式
Query query = session.createQuery("from   
        Customer c
        order by c.name asc");
query.setFirstResult(0);
query.setMaxResults(10);
List result = query.list();

//採用QBC檢索方式
Criteria criteria = session.createCriteria(
             Customer.class);
criteria.addOrder(
              Order.asc("name") );
criteria.setFirstResult(0);
criteria.setMaxResults(10);
List result = criteria.list();

鏈索查詢
List list = session.createQuery("from Hx")
            .setFirstResult(0)
            .setMaxResults(2)
            .list();
List list = session.createCriteria(Hx.class)
            .setFirstResult(0)
            .setMaxResults(2)
            .list();
檢索單個對象
Query和Criteria都提供了返回單個對象方法uniqueResult().
先調用setMaxResult(1)方法,把最大檢索數目設爲1,在調用uniqueResult()方法

Hx hx = (Hx)session.createQuery("from Hx")
            .setMaxResults(1)
            .uniqueResult();
Hx hx = (Hx)session.createCriteria(Hx.class)
         .addOrder(Order.asc("name"))
         .setMaxResults(1)
         .uniqueResult();
與對象屬性綁定
Hx hx = new Hx();
hx.setAge("33");
List list = session.createQuery("from Hx as c where c.age=:age")
            .setProperties(hx)
            .list();
SQL內連接
內連接就是傳統連接操作,用join連接關聯表,on作爲連接條件,where指定其他限定條件查詢
如:
select hx.name,hx.age,hxhome.home from hx join hxhome on hx.id=hxhome.hxid
SQL左外連接
在結果表中包含第一個表中滿足所有紀錄,如果是在連接條件上匹配紀錄,則第二個表返回相應值,否則第二個表返回空值。
如:
select hx.name,hx.age,hxhome.home from hx  left join hxhome on hx.id=hxhome.hxid

SQL右外連接
在結果表中包含第二個表中滿足所有紀錄,如果是在連接條件上匹配紀錄,則第一個表返回相應值,否則第一個表返回空值。
如:
select hx.name,hx.age,hxhome.home from hx  right outer join hxhome on hx.id=hxhome.hxid

迫切左外連接
以下兩種檢索方式是等價,它們都能同時迫切左外連接類B和類C:
//HQL迫切左外連接檢索方式
from A a left join fetch a.b b left join fetch a.c c where b is not
null and c is not null

//QBC迫切左外連接檢索方式
List result=session.createCriteria(A.class)
.setFetchMode("this.b",FetchMode.EAGER)
.setFetchMode("this.c",FetchMode.EAGER)
.add(Expression.isNotNull("this.b"))
.add(Expression.isNotNull("this.c"))
.list();
投影查詢
select關鍵字用於選擇對象部分屬性,例如:
Iterator it=session.createQuery(
    "select c.id,c.name,o.orderNumber "
 + "  from Customer c join  c.orders o "
 +" where o.orderNumber like 'T%'" ).list().iterator();

while(it.hasNext()){
 Object[] row=(Object[])it.next();
 Long orderNumber=(String)row[2];
 System.out.println(id+" "+name+" "+orderNumber);
}
投影查詢
HQL查詢語句對應SQL語句爲:
select c.ID,c.NAME,o.ORDER_NUMBER
from CUSTOMERS c inner join ORDERS o
on c.ID=o.CUSTOMER_ID where o.ORDER_NUMBER like 'T%';
以上查詢語句查詢結果如下:
+----+------+--------------+
| ID | NAME | ORDER_NUMBER |
+----+------+--------------+
|  1 | Tom  | Tom_Order001 |
|  1 | Tom  | Tom_Order002 |
|  1 | Tom  | Tom_Order003 |
+----+------+--------------+
Querylist()方法返回集合中包含三個對象數組類型元素,每個對象數組代表以上查詢結果一條記錄。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章