Hibernate中使用子查詢


子查詢:
  子查詢是SQL語句中非常重要的功能特性,它可以在SQL語句中利用另外一條SQL語句的查詢結果,在HibernateHQL查詢同樣對子查詢功能提供了支持。
 
如下面代碼所示:
List list=session.createQuery(“from Customer c where 1>(select count(o) from c.orders o)”).list();
上面的程序查詢訂單數超過1的所有客戶,因此和上面子查詢HQL語句對應的SQL語句為:
Select * from Customer c where 1>(select count(o.id) from Order o where c.id=o.customer_ID);
如果子查詢返回多條記錄,則可以使用下面關鍵字:
all:表示子查詢語句返回的所有記錄
any:表示子查詢語句返回的任意一條結果
some:”any”等價
in:”=any”等價
exists:表示子查詢語句至少返回一條記錄
例如:查詢存在一條訂單價格大於100的客戶
From Customer c where 100>any(select o.price from c.orders o);
如果在子查詢中操作集合,HQL提供了一組操縱集合的函數和屬性:
size()函數和size屬性:獲得集合中元素的數量
minIndex()函數和minIndex屬性:對於建立了索引的集合獲得最小索引值(關於集合索引參考第一部分映射值類型集合)
minElement()函數和minElement屬性:對於包含基本類型的元素集合,獲得集合中值最小的元素
maxElement()函數和maxElement屬性:對於包含基本類型元素的集合,獲得集合中值最大的元素
element()函數:獲得集合中所有元素
例如:查詢訂單數大於0的客戶
From Customer c where size(c.orders)>0;或者From Customer c where c.orders.size>0;
以上HQL語句會生成類似如下的SQL語句:
Select * from customer c where 0>(select count(o.id) from order where o. customer_ID =c.id);
 
注:HQL中子查詢必須出現在where子句中,而且必須用一對圓括號括起來。為什么必須要出現在where字句之后呢?其實我們大家仔細想一下也就知道了,在Hibernate中查詢的任何一個實體對象都要有據可循,這個“據”就是Hibernate的主配置文件,也就是說凡是出現在HQL from字句中的實體對象,都必須要在Hibernate主配置文件中有明確的配置。所以在Hibernate中無法支持SQL語句中的那種出現在from字句之后的那種動態視圖子查詢。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM