У меня есть 2 объекта Роль и перевод.
Роль -> Role_ID, код
Перевод -> Код, Язык, Имя
Идея состоит в том, чтобы сказать для определенной роли, что у нее есть английское имя, французское имя и т. Д.
Например:
Роль (1, «Rol_001») может иметь отношения: перевод («Rol_001», «английский», «») и перевод («Rol_001», «французский», «»).
Я хотел бы выразить следующий запрос SQL на HQL:
select r.Role_ID, t.Name
from Role r left outer join Translation t
on r.Code = t.Code and t.Language = @lang;
В моих файлах отображения я не имею никакого отношения между двумя сущностями, но следующий HQL-запрос работает так, как если бы он был внутренним соединением
IQuery query = session.CreateQuery("select new Lookup(r.Role, t.Name) from Role r, Translation t where r.Code = r.Code and t.Language = :language");
Если я изменю HQL на левое внешнее соединение, я получу путь, ожидаемый для исключения соединения.
Можете ли вы помочь мне со следующим:
1- Нужно ли мне менять файлы сопоставления?
2- Если я могу сохранить файлы отображения как есть, как написать такой запрос на HQL?
3- Как HQL действительно работает? Почему такой простой запрос на внешнее соединение не работает? Должно быть, я что-то здесь упускаю!
Edit:
Теперь я использую следующий код, основанный на предложении использовать CreateSQL:
ISQLQuery query = session.CreateSQLQuery("select m.MedicineTypeID, t.Name, m.IsDeleted from MedicineType m left outer join Translation t on m.Code = t.Code and t.Language = :language");
query.SetString("language", language);
IList rawLookup = query.List();
IList medicineTypesLookup = new List(rawLookup.Count);
foreach (object[] lookup in rawLookup)
{
medicineTypesLookup.Add(new Lookup((int)lookup[0], (string)lookup[1], (bool)lookup[2]));
}
return medicineTypesLookup;
Это работает, однако я хочу использовать query.List (), чтобы получить результат напрямую, а не конвертировать его сам.
Я пытался использовать query.AddEntity(typeof(Lookup));
, но получаю исключение NHibernate.MappingException: No persister for: DAL.Domain.Lookup
.
Lookup - это просто POCO и не сопоставляется ни с одной таблицей базы данных. Его файл сопоставления просто <import class="Lookup" />