Прогнозы NHibernate и условие наличия

Я использую NHibernate для запроса моей базы данных с помощью API критериев. Мои критерии ниже:

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

Это работает нормально, но я бы хотел иметь возможность ограничить запрос, чтобы он возвращался только тогда, когда свойство "Units"> 0. В SQL я бы просто использовал предложение Having Units > 0, однако я не смог найти способ сделать это в NHibernate. Есть ли у кого-нибудь идеи или это единственный вариант использовать HQL?


person lomaxx    schedule 12.03.2009    source источник


Ответы (2)


Вы можете получить доступ к ProjectionCriteria из объекта Criteria.

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

РЕДАКТИРОВАТЬ: это решение в настоящее время не работает, однако оно должно работать в NHibernate 2.1.0

person Stuart Childs    schedule 12.03.2009
comment
к сожалению, это не совсем так, как я хотел. Ограничение применяется в предложении WHERE, а не в предложении Have. Конечным результатом является то, что ограничивается каждая отдельная строка, а не сумма всех строк. - person lomaxx; 12.03.2009
comment
Странно, могу поклясться, что использовал это раньше, и это сработало. К сожалению, лучшая документация, которую я могу найти для этого, - это отправка патча: nhjira.koah.net/browse / NH-1280. - person Stuart Childs; 12.03.2009
comment
спасибо за информацию ... похоже, нам придется подождать до версии 2.1.0, прежде чем она будет поддержана. Я считаю, что он встроен в Hibernate, но NHibernate все еще ждет - person lomaxx; 12.03.2009
comment
Ах хорошо. В конечном итоге мне приходится много настраивать NHibernate с подобными вещами, поэтому я, вероятно, просто применил этот патч к своей локальной сборке библиотеки. Это могло бы объяснить, почему этого нет в документации. ;) - person Stuart Childs; 12.03.2009
comment
Хм. Я только что обновился до 2.1.0, и метод ProjectionCriteria исчез. - person madcapnmckay; 10.08.2009
comment
Я не могу найти свой тестовый пример для HAVING ... возможно, они просто очистили API, и вам больше не нужно явно указывать условия проекции как таковые через .ProjectionCriteria. SetProjection возвращает объект критериев, поэтому, возможно, вам просто нужно добавить ограничения через ICriteria .Add. - person Stuart Childs; 11.08.2009
comment
Виноват. Похоже, что этого нет только в DetachedCriteria, который я использовал. - person madcapnmckay; 14.08.2009

Для тех, кто заходит сюда с подобной проблемой, я решил ее следующим образом:

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));
person ANeves thinks SE is evil    schedule 21.09.2010