集合過濾:
對於一個已經加載的Customer對象假設對它的orders集合采用延遲加載機制那麼當調用customergetOrders(erator()時Hibernate就會初始化orders集合然後到數據庫中去加載Customer對象所關聯的Order對象並且填充orders集合但是很多時候我們其實只是需要關聯對象中符合某些條件的一部分對象而並不需要加載全部關聯對象而對性能帶來無謂的開銷這時候我們就可以利用Hibernate的集合過濾功能來處理關聯對象的加載我們看下面的代碼:
List list=sessioncreateFilter(customergetOrders()where thisprice> order by thisprice)list();
for(int i=;i<listsize();i++){
Order order=(Order)listget(i);
}
在上面代碼中通過sessioncreateFilter()方法創建了一個集合過濾的查詢對象這個方法需要兩個參數第一個參數指定需要進行過濾操作的集合第二個參數指定過濾集合的條件方法返回Query對象這個方法不要求它所要操作的集合對象已經初始化但是要求包含這個集合對象的實體對象必須處於持久化狀態當執行list()方法時不管持久化對象的集合是否已經初始化都會到數據庫中去檢索數據為了保證在Hibernate緩存中不會出現OID相同的對象如果集合對象已經初始化list()方法不會創建新的關聯實體對象而僅僅返回已經存在的關聯實體對象如果集合對象還沒有初始化那麼list()方法會創建關聯實體對象但是不會初始化容納關聯實體對象的集合除了可以向集合對象添加過濾條件進行稽核過濾之外還可以進行很多其他操作看下面的代碼:
① 對集合對象進行分頁:
List list=sessioncreateFilter(customergetOders()order by thisprice asc)
setFirstResult()
setMaxResults()
list();
②檢索集合中關聯對象的一個屬性:
List list=sessioncreateFilter(customergetOrders()select thisordernumber )list();
子查詢:
子查詢是SQL語句中非常重要的功能特性它可以在SQL語句中利用另外一條SQL語句的查詢結果在Hibernate中HQL查詢同樣對子查詢功能提供了支持如下面代碼所示:
List list=sessioncreateQuery(from Customer c where >(select count(o) from corders o))list();
上面的程序查詢訂單數超過的所有客戶因此和上面子查詢HQL語句對應的SQL語句為:
Select * from Customer c where >(select count(oid) from Order o where cid=ocustomer_ID);
如果子查詢返回多條記錄則可以使用下面關鍵字:
all:表示子查詢語句返回的所有記錄
any:表示子查詢語句返回的任意一條結果
some:與any等價
in:與=any等價
exists:表示子查詢語句至少返回一條記錄
例如:查詢存在一條訂單價格大於的客戶
From Customer c where >any(select oprice from corders o);
如果在子查詢中操作集合HQL提供了一組操縱集合的函數和屬性:
size()函數和size屬性:獲得集合中元素的數量
minIndex()函數和minIndex屬性:對於建立了索引的集合獲得最小索引值(關於集合索引參考第一部分映射值類型集合)
minElement()函數和minElement屬性:對於包含基本類型的元素集合獲得集合中值最小的元素
maxElement()函數和maxElement屬性:對於包含基本類型元素的集合獲得集合中值最大的元素
element()函數:獲得集合中所有元素
例如:查詢訂單數大於的客戶
From Customer c where size(corders)>;或者From Customer c where corderssize>;
以上HQL語句會生成類似如下的SQL語句:
Select * from customer c where >(select count(oid) from order where o customer_ID =cid);
注:在HQL中子查詢必須出現在where子句中而且必須用一對圓括號括起來為什麼必須要出現在where字句之後呢?其實我們大家仔細想一下也就知道了在Hibernate中查詢的任何一個實體對象都要有據可循這個據就是Hibernate的主配置文件也就是說凡是出現在HQL from字句中的實體對象都必須要在Hibernate主配置文件中有明確的配置所以在Hibernate中無法支持SQL語句中的那種出現在from字句之後的那種動態視圖子查詢
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28615.html