標籤:order 實體 div creat hiberna 索引 nat from index
子查詢是SQL語句中非常重要的功能特性,它可以在SQL語句中利用另外一條SQL語句的查詢結果,在Hibernate中HQL查詢同樣對子查詢功能提供了支援。 如下面代碼所示: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字句之後的那種動態視圖子查詢。
Hibernate HQL中的子查詢