NHibernate左外加入无关实体

时间:2010-09-20 15:35:20

标签: nhibernate left-join

我有2个实体角色&翻译。
角色 - > Role_ID,代码
翻译 - >代码,语言,名称

这个想法是说某个角色,它有英文名,法文名等等 例如:
角色(1,'Rol_001')可以具有以下关系:翻译('Rol_001','English','')&翻译('Rol_001','法语','')。

我想在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;

在我的映射文件中,我在2个实体之间没有任何关系,但是下面的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如何真正起作用?为什么这么简单的外连接查询不起作用?我必须在这里遗漏一些东西!

修改:
现在我使用以下基于suggetion的代码来使用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" />

2 个答案:

答案 0 :(得分:2)

最后我找到了答案:

ISession session = NHibernateHelper.Session;
ISQLQuery query = session.CreateSQLQuery("select m.MedicineTypeID as ID, 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 lookup = query.SetResultTransformer(Transformers.AliasToBean()).List();
return lookup;
查找是一个POCO类,带有无参数构造函数和3个属性ID,Name和IsDeleted。

我要感谢Kelly和Diego Mijelshon的提示。虽然他们没有提供完整的答案,但使用Session.CreateSqlQuery()是一个非常有用的提示。

所以完整的解决方案是Session.CreateSQLQuery和query.SetResultTransformer

注意:Transformers.AliasToBean()就是java。

修改http://docs.jboss.org/hibernate/orm/3.2/api/org/hibernate/impl/SQLQueryImpl.html以获取setString()

的正确方法

答案 1 :(得分:1)

您必须在映射中定义关系或执行子查询