Соедините две таблицы, сравнив одинаковое значение в двух столбцах.

Для простоты и ясности предположим, что у меня есть эти три таблицы.

Сотрудник [ id ]

Имя сотрудника [идентификатор сотрудника, имя]

Адрес сотрудника [идентификатор сотрудника, адрес]

Единственные определенные свойства/отношения находятся в «подтаблицах» EmployeeName и EmployeeAddress.

  • Имя Сотрудника Принадлежит Сотруднику
  • Адрес сотрудника принадлежит сотруднику

В основной таблице сотрудников нет свойств/отношений (коллекций), таких как

  • Сотрудник HasMany EmployeeName
  • Сотрудник HasMany EmployeeAdress.

Я хочу выполнить соединение с помощью DetachedCriteria между EmployeeName и EmployeeAddress только (без участия сотрудника) как таковое

выберите EmployeeName.name, EmployeeAddress.address
из внутреннего соединения EmployeeName EmployeeAddress
, где EmployeeName.employeeId = EmployeeAddress.employeeId и EmployeeAddress.address, например '%somelocation%', в порядке по EmployeeAddress.address


person boyan    schedule 26.01.2011    source источник
comment
Таким образом, ваши сопоставления не имеют никаких отношений между таблицами Employee и EmployeeName/EmployeeAddress?   -  person Vadim    schedule 26.01.2011
comment
Yads, да, нет сопоставлений Employee с EmployeeName/EmployeeAddress (отсутствуют отношения HasMany в классе Employee). Однако верно и обратное (отношения BelongsTo в классах EmployeeName и EmployeeAddress). В основном я пытаюсь избежать коллекций из-за некоторой бизнес-логики.   -  person boyan    schedule 27.01.2011
comment
Маурисио, я могу попробовать HQL, но значит ли это, что я наткнулся на что-то, что DetachedCriteria не может сделать по сравнению с HQL? Было бы неплохо, если бы я все еще мог использовать DetachedCriteria, чтобы иметь какой-то стандартный способ ведения дел. До сих пор все мои запросы были в форме DetachedCriteria.   -  person boyan    schedule 27.01.2011
comment
HQL проще для некоторых вещей, и я думаю, что здесь он был бы полезен. Итог: используйте правильный инструмент для работы. Не пытайтесь втиснуть все в Criteria (или NHibernate, если уж на то пошло).   -  person Mauricio Scheffer    schedule 27.01.2011


Ответы (1)


Не совсем тот запрос, который вы ищете, и не проверяли, действительно ли он работает... но он может вам помочь:

var addressCriteria = DetachedCriteria.For<EmployeeAddress>("ea")
                                      .Add(Restrictions.Like("ea.Address", "somelocation", MatchMode.Anywhere));
var nameCriteria = DetachedCriteria.For<EmployeeName>("en")
                                   .Add(Subqueries.PropertyIn("en.Employee", addressCriteria))
                                   .SetProjection(Projections.Property("en.Name"));
person Fredy Treboux    schedule 26.01.2011
comment
Это работает. Я пробовал это на самом деле. Но я понял, что не могу сортировать окончательные внешние результаты на основе свойства подзапроса, например, сортировать по адресу. - person boyan; 27.01.2011