NHibernate: получить отличные результаты на основе столбца, но получить все столбцы - PullRequest
6 голосов
/ 13 января 2010

У меня есть таблица GL, которая содержит GLCode. Мне нужно получить список уникальных GLC-кодов, но получить все остальные столбцы. Следующий SQL-запрос дает желаемые результаты.

select * from GL where GLId in (select Min(GLId) from GL group by GLCode )

Есть ли способ сделать это с помощью Criteria API?

Это моя лучшая попытка:

* +1007 *

1 Ответ

3 голосов
/ 07 мая 2011

Несмотря на то, что NHibernate не имеет возможности исключить GLCode из столбцов результатов подзапроса, все еще возможно создать запрос, который выполняет эту работу. Используйте коррелированный подзапрос EXISTS вместо IN. SQL, для которого мы стреляем, выглядит так:

select query.*
from GL query
where exists (
    select
        min(subquery.GLId) AS GLId,
        subquery.GLCode
    from GL subquery
    group by subquery.GLCode
    having min(subquery.GLId) = query.GLId);

А вот запрос NHibernate:

var min = Projections.Min("GLId");

var subquery = DetachedCriteria.For<GL>("subquery")
    .SetProjection(Projections.ProjectionList()
        .Add(Projections.GroupProperty("GLCode"), "GLCode")
        .Add(min, "GLId"))
    .Add(Restrictions.EqProperty(min, "query.GLId"));

return session.CreateCriteria<GL>("query")
    .Add(Subqueries.Exists(subquery))
    .List<GL>();
...