1. 程式人生 > >hibernate 一對多 或者多對多時候,集合屬性怎麼分頁 過濾? 一個人一百個訂單,絕對要分頁的

hibernate 一對多 或者多對多時候,集合屬性怎麼分頁 過濾? 一個人一百個訂單,絕對要分頁的

1、集合過濾:
     對於一個已經載入的Customer物件,假設對它的orders集合採用延遲載入機制,那麼當呼叫customer.getOrders().iterator()時,Hibernate就會初始化orders集合,然後到資料庫中去載入Customer物件所關聯的Order物件,並且填充orders集合,但是很多時候我們其實只是需要關聯物件中符合某些條件的一部分物件,而並不需要載入全部關聯物件,而對效能帶來無謂的開銷。這時候我們就可以利用Hibernate的集合過濾功能,來處理關聯物件的載入。我們看下面的程式碼:
List list=session.createFilter(customer.getOrders(),“where this.price>100 order by this.price”).list();
for(int i=0;i<list.size();i++){
 Order order=(Order)list.get(i);
}
在上面程式碼中通過session.createFilter()方法,建立了一個集合過濾的查詢物件,這個方法需要兩個引數,第一個引數指定需要進行過濾操作的集合,第二個引數指定過濾集合的條件,方法返回Query物件。這個方法不要求它所要操作的集合物件已經初始化,但是要求包含這個集合物件的實體物件必須處於持久化狀態。當執行list()方法時不管持久化物件的集合是否已經初始化,都會到資料庫中去檢索資料,為了保證在Hibernate快取中不會出現OID相同的物件,如果集合物件已經初始化,list()方法不會建立新的關聯實體物件,而僅僅返回已經存在的關聯實體物件。如果集合物件還沒有初始化,那麼list()方法會建立關聯實體物件,但是不會初始化容納關聯實體物件的集合。除了可以向集合物件新增過濾條件進行稽核過濾之外,還可以進行很多其他操作,看下面的程式碼:
①    、對集合物件進行分頁  該集合必須是持久態的,資料庫中存在的,查出來的,不能是新建的:


List list=session.createFilter(customer.getOders(),”order by this.price asc”)
.setFirstResult(10)
.setMaxResults(50)
.list();

query.setFirstResult(); 設定從第幾條記錄開始查起
query.setMaxResults(); 設定查多少條記錄

setFirstResult的值應該是 (當前頁面-1)X每頁條數,表示從第幾條記錄開始,

setMaxResults 就是每頁的條數了,是查詢的條數,和記錄的總條數不一樣,set之前的list.size()才是總條數

②、檢索集合中關聯物件的一個屬性:
List list=session.createFilter(customer.getOrders(),”select this.ordernumber ”).list();
2、子查詢:
  子查詢是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字句之後的那種動態檢視子查詢。