Hibernate中的迫切左外連線和左外連線
前邊我們講過了Hibernate的檢索方式及它的四個細節,常見的五中檢索方式是物件導航圖語言(customers.getOrders())、通過OID獲取物件(session.get(Department.class,1))、HQL查詢語句、QBC、本地SQL。我們詳細的講述了前邊三種且著重講述了HQL這種不同於SQL面向資料庫的面向物件的查詢語言。他在查詢語句中嵌入的是類和屬性,而不是SQL那種表名和欄位名。我們具體通過一個session.createQuery()方法獲取一個Query物件,然後通過他的setXxx()未引數或者具名引數賦值,最後呼叫Query物件的查詢方法即可。需要注意的是Query介面的方法支援方法鏈風格。且HQL還支援分頁查詢(setFirstResult()/setMaxResult())、命名查詢(在hbm中的class同級節點加一個query節點,好處是便於維護和修改)、投影查詢(只獲取部分屬性)、報表查詢(可以使用分組函式和聚集函式)。
今天我們來講一講迫切左外連線和左外連線。
1.迫切左外連線
left join fetch表示迫切左外連線檢索策略,採用這個檢索策略的話,list()方法返回的集合中存放的是實體物件的引用,而且每個實體物件關聯的物件也都會被初始化,因此也會存放所有關聯物件的實體物件。
需要注意的是,查詢結果中可能會有重複資料,需要通過LinkedHashSet包裹一下去重,然後再將其用HashSet包回原來型別。
new ArrayList(new LinkedHashSet(目標物件))
2.左外連線
left join,是指左外連線的檢索策略。採用這種檢索策略的話,list()方法返回的集合中存放的是物件陣列型別。
而且使用左外連線檢索策略的話,關聯物件的集合檢索策略是由配置檔案決定的(lazy fetch batch-size)。
3.總結
實際開發應用中,二者都會講關聯物件查詢出來,只是迫切左外連線利用反射將查出的關聯物件進行了初始化而已,所以反正都會查出相關資料,還不如直接初始化的好,所以我們在實際開發過程中都只是使用left join fetch。
還有一個迫切內連線和迫切左外連線是一個型別,只不過內連線不返回左表中不滿足表連線條件的記錄。
HQL語句中的檢索策略要高等級與配置檔案中的檢索策略,會覆蓋配置檔案,所以我們在HQL語句中使用迫切左外連線就會將配置檔案中的檢索策略覆蓋掉。