我在NHibernate中遇到一个关于使用“JoinAlias”的左连接的问题,当我要查找的结果查询SQL是这样的时候:
"select * from EntityA T1 left join EntityB T2 on T2.EntityAId=T1.id"
在NHibernate中我有这个但是不起作用:
var query = _session.QueryOver(() => EntityA)
.Left.JoinAlias(() => EntityA, () => EntityB.EntityA)
在NHibernate中EntityA
不引用EntityB
而引用EntityB
作为对EntityA
的引用。
public class EntityA
{
public int Id {get;set;}
}
public class EntityB
{
public int Id {get;set;}
public EntityA EntityA {get;set;}
}
如何在HHibernate Work中进行非常简单的左连接?
答案 0 :(得分:0)
Criteria
或QueryOver
无法做到这一点。但我们可以使用 HQL ,它支持
可能会出现多个类,从而产生笛卡尔积或“交叉”连接。
from Formula, Parameter
from Formula as form, Parameter as param
所以在上面的例子中我们会有这样的HQL:
FROM EntityA T1
, EntityB T2
WHEERE T2.EntityAId = T1.id
几乎是same issue
但是在上述情况下,已经映射了反向关系。这意味着,我们可以扩展C#实体定义:
public class EntityA
{
public int Id {get;set;}
// one-to-many
// the bidirectional mapping of the below relation
public IList<EntityB> EntityBColl { get; set; }
}
public class EntityB
{
public int Id {get;set;}
// many-to-one
// this is the inversed end in fact of the bidirectional mapping
public EntityA EntityA {get;set;}
}
有了这些,我们可以使用标准QueryOver
API:
// aliases
EntityA EntityA = null;
EntityB EntityB = null;
// query
var query = session.QueryOver(() => EntityA)
.Left.JoinAlias(() => EntityA.EntityBColl , () => EntityB)
...
;