Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NHibernate左外连接无关实体_Nhibernate_Left Join - Fatal编程技术网

NHibernate左外连接无关实体

NHibernate左外连接无关实体,nhibernate,left-join,Nhibernate,Left Join,我有两个实体角色和翻译。 角色->角色ID,代码 翻译->代码、语言、名称 意思是说对于某个角色,它有英文名、法文名等等。 例如: 角色(1,'Rol_001')可以具有以下关系:翻译('Rol_001','English','')和翻译('Rol_001','French','') 我想用HQL表达以下SQL查询: select r.Role_ID, t.Name from Role r left outer join Translation t on r.Code = t.Code

我有两个实体角色和翻译。
角色->角色ID,代码
翻译->代码、语言、名称

意思是说对于某个角色,它有英文名、法文名等等。
例如:
角色(1,'Rol_001')可以具有以下关系:翻译('Rol_001','English','')和翻译('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更改为left-outer-join,则会得到join异常所需的路径

你能帮我做以下事情吗:
1-我需要更改映射文件吗?
2-如果可以保持映射文件不变,如何在HQL中编写这样的查询?
3-HQL到底是如何工作的?为什么这么简单的外部联接查询不起作用?我一定是错过了什么

编辑:
现在,我使用以下基于建议的代码来使用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:DAL.Domain.Lookup没有持久化器


查找只是一个POCO,不映射到任何数据库表。它的映射文件只是

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

最后我找到了答案:
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语言


编辑:对于
setString()

的正确方法,HQL使用映射关系,而不是任意连接子句。您可以使用SQL来实现这一点。这是一个SQL Server CE,我可以直接使用NHibernate执行SQL语句,还是使用SqlCeConnection和SqlCeCommand来执行SQL语句并获得结果?我知道我可以使用session.CreateSQLQuery,但结果是对象[]。我试图找到一种方法以IList的形式获取结果,最后我使用query.SetResultTransformer(Transformers.AliasToBean()).List()找到了答案;现在可以使用NHibernate v3.3.1和LINQ API实现这一点。请参阅下面的答案以获取示例:再次查看您的示例,您可能需要使用两个单独的查询(一个用于角色,一个用于语言),然后使用进程内linq左外联接。但是,在我看来,这不是一个好的解决方案,您应该在映射中定义简单的关系,或者使用session.CreateSqlQuery()。