我为以下问题编写sql没有问题。但是,我想把它写成HQL或ICriteria。我使用流利的nhibernate和最新的nhibernate。情况:
共有6类A B C D AC AD。 B继承自A. AC表示A和C之间的m:m关系,AD表示A和D之间的m:m关系。让我们假设所有类都有一个ID列。我想计算一下C和D的数量。
没有IList,例如,A中的C(和B)。这些课程仍然相关......
这是一些代码(简化):
public class A : Entity
{
}
public class B : A
{
}
public class C : Entity
{
}
public class D : Entity
{
}
public class AC : Entity
{
public virtual A A { get; set; }
public virtual C C { get; set; }
}
public class AD : Entity
{
public virtual A A { get; set; }
public virtual D D { get; set; }
}
在我的特定情况下,是否可以使用HQL和'left join'(也显示具有零C和D的B)?
感谢。
基督教
PS:
我使用theta样式连接玩了一下,但没有得到预期的结果,我不认为'左连接'可能在这里不是吗?
PPS:
这种θ式连接类型有效,但只有在B与至少1 C和D相关时才会起作用:
select
B.Id,
count(distinct AC.C.Id),
count(distinct AD.D.Id)
from AC AC, AD AD, B B
where AC.A.Id = B.Id and AD.A.Id = B.Id
group by B.Id
答案 0 :(得分:1)
您可以使用两个查询并对结果求和:
int numberOfLinks;
numberOfLinks = session
.CreateQuery(
@"select count(*)
from AC ac
where ac.A = :b"
.SetEntity("b", myB)
.UniqueResult<int>();
numberOfLinks += session
.CreateQuery(
@"select count(*)
from AD ad
where ad.A = :b"
.SetEntity("b", myB);
我无法通过单个查询找到一种方法。你的类似乎不是为那种查询设计的......(可能表示设计不合适,但不一定是。这取决于如何典型的查询适用于您的应用程序。)
相反,如果您拥有这些导航路径,而不会质疑关系类:
public class A : Entity
{
IList<AC> ACs { get; private set; }
IList<AD> ADs { get; private set; }
}
你可以通过以下方式获得列表的大小:
numberOfLinks = session.CreateQuery(
@"select size(ACs) + size(ADs)
from B
where ...")
甚至在记忆中更容易: - )
numberOfLinks = myB.ADs.Count + myB.ACs.Count;
完全删除关系类,它可能如下所示:
public class A : Entity
{
IList<C> Cs { get; private set; }
IList<D> Ds { get; private set; }
}
public class C : Entity
{
IList<A> As { get; private set; }
}
public class D : Entity
{
IList<A> As { get; private set; }
}