Ваш SQL:
ВЫБРАТЬ sd ОТ SnapshotDates sd, (SELECT max (x.changeDate) maxChangeDate, x.viewId, x.state FROM SnapshotDates x WHERE x.changeDate <: дата Иx.viewId в (: viewIds) И x.state =: состояние GROUP BY x.viewId, x.state) sd2 WHERE sd.viewId = sd2.viewId AND sd.state =: состояние AND sd.changeDate = sd2.maxChangeDate </p>
Вы можете переписать свой sql как
SELECT sd
FROM SnapshotDates sd,
WHERE sd.viewId in (:viewIds)
AND sd.state = :state
sd.changeDate = (SELECT max(x.changeDate) FROM SnapshotDates x WHERE x.viewId = ds.viewId AND x.state = ds.state)
Найти вдохновленный примером
SELECT m FROM Professor m WHERE (SELECT COUNT(e) FROM Professor e WHERE e.manager = m) > 0
http://www.java2s.com/Code/Java/JPA/EJBQLWhereClauseWithSubQuery.htm
Мой аналогичный пример у меня былSQL
select k.* from kredits k,
(select client_id, max(r_date) r_date from kredits k group by client_id) k2
where k.client_id = k2.client_id
AND k.r_date = k2.r_date
order by k.id
Перепишите его для PQL
select k From Kredit k
where k.rDate = (select MAX(k2.rDate) from Kredit k2 where k2.clientId = k.clientId)
order by k.id
Он будет переведен в
select kredit0_.id as id28_, kredit0_.client_id as client59_28_ from kredits kredit0_
where kredit0_.r_date=(select MAX(kredit1_.r_date) from kredits kredit1_ where kredit1_.client_id=kredit0_.client_id)
order by kredit0_.id
, возвращающий тот же результат, что и SQL.
ИспользованиеHebirnate 3.3.1 с MySQL 5.0.24