AFAIK, вы вообще не можете присоединиться к подзапросам в NHibernate, но вы можете реорганизовать запрос, чтобы использовать предложение EXISTS или IN для репликации той же функциональности.
Я понимаю, что вопрос требует, чтобы это былозакончил с использованием API Criteria, но я думал, что выложу версию HQL, которая может дать кому-то еще некоторые идеи.
var results = session.CreateQuery("from Product p where p.Id in (
select max(p2.id)
from Product p2
group by p2.col1
)")
Я также обнаружил эту проблему JIRA, касающуюся API Criteria и не включающую группирование по столбцам в выборке.,В настоящее время, похоже, что то, чего вы хотите, вообще не может быть достигнуто с помощью API Criteria.
Группировать по свойству без добавления его в предложение select
UPDATE Используя пример из поста Monkey Coders, вы можете сделать следующее:
var subquery = DetachedCriteria.For<Product>("p")
.SetProjection(Projections.ProjectionList()
.Add(Projections.GroupProperty("p.Col1"))
.Add(Restrictions.EqProperty("p2.Id", Projections.Max("p.Id"));
var query = DetachedCriteria.For<Product>("p2")
.Add(Subqueries.Exists(subquery));
, что приведет к следующему SQL
select *
from Product p2
where exists (
select p.col1
from Product p
group by p.col1
having p2.Id=max(p.Id)
)