我有 2 个实体角色和翻译。
角色 -> Role_ID、代码
翻译 -> 代码、语言、名称
这个想法是说对于某个角色,它有英文名、法文名等等。
例如:
Role(1, 'Rol_001') 可以具有以下关系:Translation('Rol_001', 'English', '') & Translation('Rol_001', 'French', '')。
我想用HQL表达以下SQL查询:
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" />