Я сделал сценарий здесь,
Таблица
key name version
----------- -------------------- -----------
1 adeel 1
2 adeel 2
3 adeel 3
4 ahmad 1
5 ahmad 2
6 ahmad 3
7 ahmad 4
8 ansari 1
9 ansari 2
10 ansari 3
Результат с использованием исходного запроса
>> select f.name, max(f.version) from FeatureList f group by f.name
name max(f.version)
-------------------- ------------
adeel 3
ahmad 4
ansari 3
Результат с использованием желаемого запроса
>> select fl.* from FeatureList fl
where (fl.name, fl.version) in (select f.name, max(f.version)
from FeatureList f group by f.name);
key name max(fl.version)
----------- -------------------- -----------
3 adeel 3
7 ahmad 4
10 ansari 3
Примечание: на этот раз попробовал использовать MySQL. Работает. Я уверен, что MS SQL Server также имеет оператор IN (...)
. Вам просто нужно использовать session.createNativeQuery()
в Hibernate.
Отредактировано для работы над ответом акставта
Как мы выяснили, это можно сделать так же просто, как,
select f from FeatureList f
where f.version =
(select max(ff.version) from FeatureList ff where ff.name = f.name)
Теперь попробуйте то же самое, используя Hibernate Criteria API ,
DetachedCriteria versions = DetachedCriteria.forClass(FeatureList.class, "f")
.setProjection( Property.forName("f.version").max())
.add(Property.forName("f.name").eqProperty("fl.name"));
session.createCriteria(FeatureList.class, "fl")
.add( Property.forName("fl.version").eq(versions) )
.list();