2010-02-05 111 views
8

我正在做一個左外連接,但我只能對第一個表應用限制。第二張桌子上還有一種方法嗎?休眠條件:左外部加入對兩個表的限制

這裏是我的代碼:

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

此作品(申請人的applicantName屬性):

criteria.add(Restrictions.eq("applicantName", "Markos") 

無論這些作品(產品有產品名稱屬性)

criteria.add(Restrictions.eq("productName", "product1") 

criteria.add(Restrictions.eq(「products.productName」,「product1」)//產品:屬性的名稱 criteria.add(Restrictions.eq(「Product.productName」,「product1」)// Product:數據庫表的名稱

這是我收到的異常(如果我理解正確)產品名稱屬性不存在申請人:

EJB Exception: ; nested exception is: org.hibernate.QueryException: could not resolve property: products.inventedName of: org.myCompany.applicant.entity.Applicant; nested exception is: org.hibernate.QueryException: could not resolve property: products.inventedName of: org.myCompany.applicant.entity.Applicant 

我試圖使用的別名,但這種生成INNER JOIN,而不是LEFT OUTER JOIN的我想要的。

如何對兩個表應用限制?

UPDATE:

問題可能與此相同: https://forum.hibernate.org/viewtopic.php?p=2393694

回答

12

您可以指定左外連接在createalias ...

.CreateAlias("products", "p", NHibernate.SqlCommand.JoinType.LeftOuterJoin) 
.Add(Restrictions.Eq("p.inventedName", inventedName)); 

要知道,你是做一個左邊的外部連接,並在該列上加上限制......基本上使它成爲內部連接。如果您還希望沒有產品的申請人,那麼您也必須檢查空產品。

0

更新:

.CreateAlias("products", "p", JoinType.LEFT_OUTER_JOIN) 
.Add(Restrictions.Eq("p.inventedName", inventedName)); 
0

我解決了這個問題,我創建一個新的標準,我可以在這兩種情況下使用LEFT_OUTER_JOIN。