HQL加入问题

时间:2011-08-03 11:15:42

标签: hibernate nhibernate fluent-nhibernate

我为以下问题编写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

1 个答案:

答案 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; }
}