2010-02-05 110 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。