2010-02-05 69 views
21

我想使用Criteria API在兩個表之間執行左外連接。所有我能找到在Hibernate文檔中是這樣的方法:(懶惰)使用Hibernate Criteria API的左外連接

Criteria criteria = this.crudService 
      .initializeCriteria(Applicant.class) 
      .setFetchMode("products", FetchMode.JOIN) 
      .createAlias("products", "product"); 

然而,這無論是進行內連接或右外連接,因爲它返回結果的數量。

我也希望我的加入是懶惰的。我怎樣才能做到這一點?

乾杯!

UPDATE:似乎使用別名會自動連接INNER JOIN。在我還沒有掌握的「背景故事」中有一些東西。所以,今天沒有別名。這給我留下了對兩個表應用限制的問題,因爲它們都有一個列(或屬性,如果這更合適)'名稱'。

+2

接受答案了。 – 2013-04-30 21:05:18

+0

我想知道你在Hibernate中的createAlia()的引用默認情況下創建一個INNER JOIN「。我搜索了API,看不到它。謝謝。 – FaithReaper 2016-03-11 11:33:34

回答

0

連接處於SQL請求中。它不能懶惰。


用Hibernate,爲了檢索懶惰的數據,只需從HQL請求中排除它。然後,當你訪問實體上的getters(如果你的Session仍然打開),它將自動加載(你不必寫這部分請求)。

+0

對不起,我沒有得到這個。也許我應該改寫一下:我想有一個左外連接,但我也希望只有在需要時纔會檢索數據(適當的getter被調用)。懶惰(或急切)以某種方式與發生的SQL JOIN類型相關聯? – 2010-02-05 11:25:46

+0

懶惰可以用對象來實現,但不能用SQL請求來實現。一個請求被完全執行一次,它的設計並非如此,以便稍後在需要的時候執行部分請求! – KLE 2010-02-05 11:35:14

+0

在HQL中我寫了LEFT OUTER JOIN FETCH。所以,大概一個HQL查詢對應於許多SQL,在需要時執行?無論如何,懶惰與否,我如何做一個左外連接?而不是在HQL中,使用Criteria API。乾杯! – 2010-02-05 11:42:27

34

如果需要左連接產品表只是做:

..... createAlias( 「產品」, 「產品」,Criteria.LEFT_JOIN);

+0

真的很簡單和有益的,非常感謝! – Sllouyssgort 2014-12-19 10:39:32

+1

現在不贊成使用Ankit的答案 – jlars62 2015-09-02 23:07:21

20

Sdavids答案的API現在是deprecated。它的更新版本

.... createAlias( 「僱員」, 「EMP」,JoinType.LEFT_OUTER_JOIN)

+0

謝謝。它可以幫助我消除不推薦使用的API – 2015-03-03 08:33:09