2011-01-26 2 views
0

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

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

EmployeeName [ EmployeeID, имя ]

EmployeeAddress [ EmployeeID, адрес ]

Единственные свойства/отношения, определенные находятся в 'подтаблице' EmployeeName & EmployeeAddress

  • EmployeeName BelongsTo Сотрудник
  • EmployeeAddress BelongsTo Сотрудник

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

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

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

выберите EmployeeName.name, EmployeeAddress.address
из EmployeeName internal join EmployeeAddress
где EmployeeName.employeeId = EmployeeAddress.employeeId и EmployeeAddress.addre сс как порядка «% somelocation%» по EmployeeAddress.address

+0

Таким образом, ваши сопоставления не имеют никаких связей между таблицами Employee и EmployeeName/EmployeeAddress? – Vadim

+0

Почему бы не использовать HQL? –

+0

Yads, да нет сопоставлений от Employee to EmployeeName/EmployeeAddress (нет отношений HasMany в классе Employee). Однако обратное верно (отношения BelongsTo в классах EmployeeName и EmployeeAddress). В основном я стараюсь избегать коллекций из-за какой-то бизнес-логики. – boyan

ответ

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")); 
+0

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