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

问题描述 投票:1回答:2

为什么这个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。感谢您的任何见解。

nhibernate criteria
2个回答
0
投票

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

排序在集合映射中定义。在你的情况下可能是FundingPrograms项目的映射。你不能通过调用.ClearOrders()来清除它

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


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.