2009-03-12 5 views
5

J'utilise NHibernate pour interroger ma base de données avec l'API de critères. Mes critères est ci-dessous:Projections NHibernate et clause "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); 

Cela fonctionne très bien, mais ce que je voudrais est un moyen d'être en mesure de limiter la requête à ne revenir lorsque la propriété « Unités » est> 0. Dans SQL Je voudrais simplement nous une clause Having Units > 0 mais je n'ai pas réussi à trouver un moyen de le faire dans NHibernate. Est-ce que quelqu'un a des idées ou est ma seule option pour utiliser HQL?

Répondre

5

Vous pouvez accéder à ProjectionCriteria à partir de l'objet Criteria.

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

EDIT: Cette solution ne fonctionne pas encore, mais il devrait fonctionner dans NHibernate 2.1.0

+2

Malheureusement, cela ne fonctionne pas tout à fait comme je le voulais. La restriction est appliquée dans la clause WHERE plutôt que dans une clause having. Le résultat final étant que chaque ligne individuelle est restreinte plutôt que la somme de toutes les lignes. – lomaxx

+0

Bizarre, je pourrais jurer d'avoir déjà utilisé ça et ça a marché. Malheureusement, la meilleure documentation que je puisse trouver pour cela est la soumission de patch: http://nhjira.koah.net/browse/NH-1280. –

+1

merci pour l'info ... on dirait que nous devrons attendre 2.1.0 avant que cela ne soit supporté. Je crois que c'est intégré dans Hibernate mais NHibernate attend toujours – lomaxx

3

Pour quiconque tombe par ici avec un problème similaire, je viens de résoudre cette façon:

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)); 
Questions connexes