Критерии гибернации: левое внешнее соединение с ограничениями на обе таблицы - PullRequest
9 голосов
/ 05 февраля 2010

Я делаю LEFT OUTER JOIN, но я могу применять ограничения только к первой таблице. Есть ли способ применить и ко второму столу?

Вот мой код:

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")

attribute.add (Restrictions.eq ("products.productName", "product1") // products: название объекта crit.add (Restrictions.eq ("Product.productName", "product1") // Product: имя таблицы БД

И это исключение, которое я получаю, говоря (если я правильно понимаю), что свойство 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

Я пытался использовать псевдоним, но это вызвало ВНУТРЕННЕЕ СОЕДИНЕНИЕ, а не ВЛЕВОЕ НАРУЖНОЕ СОЕДИНЕНИЕ, которое я хочу.

Как я могу применить ограничения к обеим таблицам?

UPDATE:

Проблема, вероятно, такая же: https://forum.hibernate.org/viewtopic.php?p=2393694

Ответы [ 3 ]

18 голосов
/ 05 февраля 2010

Вы можете указать левое внешнее объединение в createalias ...

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

Имейте в виду, что вы делаете левое внешнее соединение с ограничением на этот столбец ... по сути, делая его внутренним соединением. Если вы также хотите, чтобы кандидаты не имели продуктов, вам придется также проверить наличие нулевого продукта.

0 голосов
/ 27 июня 2013

Я решил эту проблему, создав новый критерий, и я мог использовать LEFT_OUTER_JOIN в обоих случаях.

0 голосов
/ 04 февраля 2013

Обновление:

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