2009-04-29 14 views
1

Pourquoi cette requête de critères nhibernate produirait-elle la requête sql ci-dessous?La requête de critères Nhibernate insère un ordre supplémentaire par expression lors de l'utilisation de JoinType.LeftOuterJoin et Projections

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 

Elle met mal la p2_name asc dans l'instruction ORDER BY, et le faisant tomber en panne. Cela se produit uniquement lorsque j'utilise JoinType.LeftOuterJoin sur mes critères de projets. Est-ce un bug nhibernate connu? J'utilise nhibernate 2.0.1.4000. Merci pour tout commentaire.

+0

Salut, avez-vous trouvé une solution pour cela? Je suis en quelque sorte confronté au même problème ... –

Répondre

0

Je sais qu'il est vieux, mais je suis tombé sur le même problème.

La commande a été définie dans le mappage de la collection. Dans votre cas probablement la cartographie des projets dans le FundingPrograms. Vous ne pouvez pas pouvez l'effacer en appellent .ClearOrders()

Ma solution était d'ajouter un regroupement sur la propriété, il essaie de trier, dans votre cas .Add(Projections.Group(() => p.name))