I already tried using Restrictions.Not instead of ! (I probably should have noted that in my original post). Restrinctions.Not and ! generate identical T-SQL and therefore an identical error.
Mike On Oct 25, 9:34 am, John Davidson <[email protected]> wrote: > Replace the "!" with Restrictions.Not and then retry. > > John Davidson > > > > On Mon, Oct 25, 2010 at 9:13 AM, Mike <[email protected]> wrote: > > NHibernate 2.1.2 and SQLServer 2005 > > > I am trying to implement a Criteria query that generates a HAVING > > clause with a NotEqual condition. Here's my query with a Gt > > restriction > > > ICriteria query = session.CreateCriteria<Activity>() > > .Add(Subqueries.PropertyIn("ActivityId", > > DetachedCriteria.For<Milestone>() > > > .SetProjection(Projections.GroupProperty("Activity")) > > > .Add(Restrictions.Gt(Projections.Sum("MilestoneAmount"), > > 0)))); > > > and this is the generated T-SQL, which runs correctly > > > SELECT this_.ACTIVITY as ACTIVITY5_0_, this_.CONTRACT as CONTRACT5_0_ > > FROM prod.lawson.ACACTIVITY this_ WHERE this_.ACTIVITY in (SELECT > > this_0_.ACTIVITY as y0_ FROM prod.lawson.ACMILESTNX this_0_ GROUP BY > > this_0_.ACTIVITY HAVING sum(this_0_.BILL_AMOUNT) > @p0);@p0 = 0 > > > When I change the Gt to NotEqual as follows (note the ! added to the > > restriction on the Sum projection) > > > ICriteria query = session.CreateCriteria<Activity>() > > .Add(Subqueries.PropertyIn("ActivityId", > > DetachedCriteria.For<Milestone>() > > > .SetProjection(Projections.GroupProperty("Activity")) > > .Add(! > > Restrictions.Eq(Projections.Sum("MilestoneAmount"), 0)))); > > > it generates the following T-SQL > > > SELECT this_.ACTIVITY as ACTIVITY5_0_, this_.CONTRACT as CONTRACT5_0_ > > FROM prod.lawson.ACACTIVITY this_ WHERE this_.ACTIVITY in (SELECT > > this_0_.ACTIVITY as y0_ FROM prod.lawson.ACMILESTNX this_0_ WHERE not > > (sum(this_0_.BILL_AMOUNT) = @p0) GROUP BY this_0_.ACTIVITY);@p0 = 0 > > > which results in the following error > > > An aggregate may not appear in the WHERE clause unless it is in a > > subquery contained in a HAVING clause or a select list, and the column > > being aggregated is an outer reference. > > > How can I change my query so that the generated T-SQL is > > > SELECT this_.ACTIVITY as ACTIVITY5_0_, this_.CONTRACT as CONTRACT5_0_ > > FROM prod.lawson.ACACTIVITY this_ WHERE this_.ACTIVITY in (SELECT > > this_0_.ACTIVITY as y0_ FROM prod.lawson.ACMILESTNX this_0_ GROUP BY > > this_0_.ACTIVITY HAVING sum(this_0_.BILL_AMOUNT) <> @p0);@p0 = 0 > > > That is, the original query with the > in the HAVING clause replaced > > by <>. Presumably, I could just use Restrictions.Ne, if it were > > available. > > > Thanks, > > > Mike > > > -- > > You received this message because you are subscribed to the Google Groups > > "nhusers" group. > > To post to this group, send email to [email protected]. > > To unsubscribe from this group, send email to > > [email protected]<nhusers%[email protected]> > > . > > For more options, visit this group at > >http://groups.google.com/group/nhusers?hl=en.- Hide quoted text - > > - Show quoted text - -- You received this message because you are subscribed to the Google Groups "nhusers" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/nhusers?hl=en.
