当使用JoinType.LeftOuterJoin和Projections时,Nhibernate条件查询通过表达式插入额外的顺序

时间:2009-04-29 13:41:12

标签: nhibernate criteria

为什么这个nhibernate条件查询会在下面生成sql查询?

return Session.CreateCriteria(typeof(FundingCategory), "fc")
    .CreateCriteria("FundingPrograms", "fp")
    .CreateCriteria("Projects", "p", JoinType.LeftOuterJoin)
    .Add(Restrictions.Disjunction()
        .Add(Restrictions.Eq("fp.Recipient.Id", recipientId))
        .Add(Restrictions.Eq("p.Recipient.Id", recipientId))
    )
    .SetProjection(Projections.ProjectionList()
        .Add(Projections.GroupProperty("fc.Name"), "fcn")
        .Add(Projections.Sum("fp.ObligatedAmount"), "fpo")
        .Add(Projections.Sum("p.ObligatedAmount"), "po")
    )
    .AddOrder(Order.Desc("fpo"))
    .AddOrder(Order.Desc("po"))
    .AddOrder(Order.Asc("fcn"))
    .List<object[]>();
SELECT   this_.Name                as y0_,
         sum(fp1_.ObligatedAmount) as y1_,
         sum(p2_.ObligatedAmount)  as y2_
FROM     fundingCategories this_
         inner join fundingPrograms fp1_
           on this_.fundingCategoryId = fp1_.fundingCategoryId
         left outer join projects p2_
           on fp1_.fundingProgramId = p2_.fundingProgramId
WHERE    (fp1_.recipientId = 6 /* @p0 */
           or p2_.recipientId = 6 /* @p1 */)
GROUP BY this_.Name
ORDER BY p2_.name asc,
         y1_ desc,
         y2_ desc,
         y0_ asc

将p2_name asc错误地放入ORDER BY语句并导致其崩溃。只有在我的Projects条件中使用JoinType.LeftOuterJoin时才会发生这种情况。这是一个已知的nhibernate错误吗?我正在使用nhibernate 2.0.1.4000。感谢您的任何见解。

2 个答案:

答案 0 :(得分:0)

我在nh jira论坛上发布了这个错误。

https://nhibernate.jira.com/browse/NH-1761

答案 1 :(得分:0)

我知道它已经老了,但我遇到了同样的问题。

排序是在集合映射中定义的。在您的情况下,可能是FundingPrograms中项目的映射。 您无法通过调用.ClearOrders()

来清除它

我的解决方案是在您尝试排序的属性上添加分组,在您的情况下 .Add(Projections.Group(() => p.name))