9

LEFT OUTER JOIN を実行していますが、制限を適用できるのは最初のテーブルだけです。2番目のテーブルにも適用する方法はありますか?

これが私のコードです:

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

これはうまくいきます(申請者にはapplicantNameプロパティがあります):

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

これらのどちらも機能しません (製品には productName プロパティがあります)

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

criteria.add(Restrictions.eq("products.productName", "product1") // 製品: プロパティの名前 criteria.add(Restrictions.eq("Product.productName", "product1") // 製品: DB テーブルの名前

そして、これは、productName プロパティが Applicant に存在しないという例外です (正しく理解している場合)。

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

エイリアスを使用しようとしましたが、必要な LEFT OUTER JOIN ではなく、INNER 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));

その列に制限を付けて左外部結合を行っていることに注意してください...本質的にそれを内部結合にします。製品のない応募者も必要な場合は、null 製品もチェックする必要があります。

于 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 に答える