9

我正在做一个 LEFT OUTER JOIN,但我只能在第一个表上应用限制。有没有办法也适用于第二张桌子?

这是我的代码:

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

这有效(申请人有一个申请人名称属性):

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

这些都不起作用(产品具有 productName 属性)

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

criteria.add(Restrictions.eq("products.productName", "product1") // products: 属性的名称 criteria.add(Restrictions.eq("Product.productName", "product1") // Product: the数据库表的名称

这是我收到的例外情况(如果我理解正确的话)申请人中不存在 productName 属性:

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。

如何对两个表应用限制?

更新:

问题可能与此相同: https ://forum.hibernate.org/viewtopic.php?p=2393694

4

3 回答 3

18

您可以在 createalias 中指定左外连接...

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

请注意,您正在执行对该列有限制的左外连接......本质上使其成为内连接。如果您还希望申请人没有产品,那么您也必须检查空产品。

于 2010-02-05T15:59:46.287 回答
1

更新:

.CreateAlias("products", "p", JoinType.LEFT_OUTER_JOIN)
.Add(Restrictions.Eq("p.inventedName", inventedName));
于 2013-02-04T18:04:47.740 回答
0

我解决了这个我的问题,创建了一个新的标准,我可以在这两种情况下使用 LEFT_OUTER_JOIN。

于 2013-06-27T13:47:04.593 回答