2009-03-12 17 views
5

Estoy usando NHibernate para consultar mi base de datos con la API de criterios. Mi criterio es a continuación:NHibernate Projections y la cláusula "Having"

ICriteria c = Session.CreateCriteria(typeof(Transaction)); 

ProjectionList projections = Projections.ProjectionList(); 
projections.Add(Projections.Sum("Units"), "Units"); 
projections.Add(Projections.GroupProperty("Account"), "Account"); 
projections.Add(Projections.GroupProperty("Security"), "Security"); 
c.SetProjection(projections); 

Esto está trabajando muy bien, pero lo que me gustaría es una manera de ser capaz de limitar la consulta a devolver sólo cuando la propiedad "Unidades" es> 0. En SQL lo haría simplemente nosotros una cláusula Having Units > 0 sin embargo no he podido encontrar una manera de hacer esto en NHibernate. ¿Alguien tiene alguna idea o es mi única opción para usar HQL?

Respuesta

5

Puede acceder a ProjectionCriteria desde el objeto Criteria.

... 
c.SetProjection(projections) 
.ProjectionCriteria 
.Add(Restrictions.Ge("Units", 0)); 

EDIT: Esta solución no funciona actualmente, sin embargo se debe trabajar en NHibernate 2.1.0

+2

desafortunadamente, esto no funciona del todo como yo quería. La restricción se aplica en la cláusula WHERE en lugar de en una cláusula having. El resultado final es que cada fila individual está restringida en lugar de la suma de todas las filas. – lomaxx

+0

Extraño, podría jurar que lo he usado antes y funcionó. Desafortunadamente, la mejor documentación que puedo encontrar es el envío del parche: http://nhjira.koah.net/browse/NH-1280. –

+1

gracias por la información ... parece que tendremos que esperar a 2.1.0 antes de que esto sea compatible. Creo que está integrado en Hibernate pero NHibernate todavía está esperando – lomaxx

3

Para quien cae por aquí con un problema similar, me acabo de resolver de esta manera:

IProjection howMany = Projections.Count("Id").As("HowMany"); 

ICriteria criteria = session 
    .CreateCriteria<L10N>() 
    .SetProjection(
     howMany, 
     Projections.GroupProperty("Native"), 
     Projections.GroupProperty("Locale") 
    ); 

criteria.Add(Restrictions.Gt(howMany,1));