Критерии перехода в спящий режим:Левое внешнее соединение с ограничениями для обеих таблиц

StackOverflow https://stackoverflow.com/questions/2208201

Вопрос

Я выполняю ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ, но я могу применять ограничения только к первой таблице.Есть ли способ применить это и ко второй таблице?

Вот мой код:

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(Ограничения.eq("products.ProductName", "product1") // продукты:имя свойства criteria.add(Ограничения.eq("Product.ProductName", "product1") // Продукт:имя таблицы базы данных

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

Я попытался использовать псевдоним, но это сгенерировало ВНУТРЕННЕЕ СОЕДИНЕНИЕ вместо нужного мне ЛЕВОГО ВНЕШНЕГО СОЕДИНЕНИЯ.

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

Обновить:

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

Это было полезно?

Решение

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

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

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

Другие советы

Обновить:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top