子查詢:
子查詢是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字句之后的那種動態視圖子查詢。