JPA / hibernate подзапрос в предложении from - PullRequest
20 голосов
/ 01 сентября 2011

Мы используем JPA с Hibernate в качестве поставщика, у нас есть запрос, содержащий соединение с подзапросом в предложении FROM, но мы получаем следующую ошибку:

org.hibernate.hql.ast.QuerySyntaxException: неожиданный токен: (рядом строка 1, столбец 75 [ВЫБРАТЬ sd ОТ com.hp.amber.datamodel.entities.analysis.SnapshotDates sd, (ВЫБРАТЬ max (x.changeDate) maxChangeDate, x.viewId, x.state FROM com.hp.amber.datamodel.entities.analysis.SnapshotDates x ГДЕ x.changeDate <: date И x.viewId в (: viewIds) И x.state =: состояние GROUP BY x.viewId, x.state) sd2 ГДЕ sd.viewId = sd2.viewId AND sd.state = : состояние AND sd.changeDate = sd2.maxChangeDate] </p>

Это запрос:

SELECT sd 
FROM SnapshotDates sd, 
     (SELECT max(x.changeDate) maxChangeDate, x.viewId, x.state 
      FROM SnapshotDates x
     WHERE x.changeDate<:date AND x.viewId in (:viewIds) AND x.state=:state
GROUP BY x.viewId, x.state) sd2
WHERE sd.viewId = sd2.viewId 
      AND sd.state = :state 
      AND sd.changeDate = sd2.maxChangeDate

Спасибо за помощь

Ответы [ 2 ]

26 голосов
/ 03 сентября 2011

Я не думал, что HQL может выполнять подзапросы в предложении from

https://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch16.html#queryhql-subqueries

обратите внимание на предложение:

Обратите внимание, что подзапросы HQL могут встречаться только в предложениях select или where.

Я полагаю, вы могли бы изменить его на собственный запрос и выполнить его таким образом.

3 голосов
/ 09 сентября 2011

Ваш 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...