2009-03-12 16 views
5

Używam NHibernate do wysyłania zapytań do mojej bazy danych przy użyciu API kryteriów. Kim jest poniżej kryteria:Projekcje NHibernate i klauzula "o"

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

to działa dobrze, ale co chciałbym jest sposobem, aby móc ograniczyć zapytanie do powrotu, gdy tylko „Jednostki” własność jest> 0. W SQL bym po prostu nam klauzula Having Units > 0 jednak nie byłem w stanie znaleźć sposób, aby to zrobić w NHibernate. Czy ktoś ma jakieś pomysły lub jest moją jedyną opcją korzystania z HQL?

Odpowiedz

5

Możesz uzyskać dostęp do ProjectionCriteria z obiektu Criteria.

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

EDIT: To rozwiązanie nie pracuje obecnie, jednak powinien on pracować w NHibernate 2.1.0

+2

Niestety, to nie działa tak, jak chciałem. Ograniczenie jest stosowane w klauzuli WHERE, a nie w klauzuli posiadania. Końcowym rezultatem jest to, że każdy pojedynczy wiersz jest ograniczony, a nie suma wszystkich wierszy. – lomaxx

+0

Dziwne, mógłbym przysiąc, że użyłem tego wcześniej i zadziałało. Niestety najlepsza dokumentacja, którą mogę znaleźć, to łatka: http://nhjira.koah.net/browse/NH-1280. –

+1

dzięki za informacje ... wygląda na to, że będziemy musieli poczekać na 2.1.0, zanim to będzie obsługiwane. Wierzę, że jest wbudowany w Hibernate, ale NHibernate wciąż czeka – lomaxx

3

Dla kogo spada o tutaj z podobnym problemem, po prostu rozwiązano to w ten sposób:

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