Выполнить Inner Join в подзапросе с несколькими столбцами в HQL? - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь объединить таблицу с результатом подзапроса (подзапрос возвращает результат с 3 столбцами) в HQL, но я получаю синтаксическую ошибку org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token.

Похоже, INNER JOIN не работает в HQL, как в SQL, поэтому я посмотрел на https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html#queryhql-subqueries, но это не помогло.

Запрос HQL

SELECT R
FROM Table R
INNER JOIN (
   SELECT T.id.col1, T.id.col2, MAX(T.col3) max_num
   FROM Table T
   GROUP BY T.id.col1
) b ON R.id.col1 = b.id.col1 AND R.col3 = b.max_num
WHERE R.id.col3 = :param
GROUP BY R.id.col1
ORDER BY R.col3 DESC

Фактический результат

org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: ( near line 1, column 81

Ожидаемый результат

Уникальные строки, содержащиемаксимальное значение T.col3.

Примечание. SQL-версия вышеуказанного запроса работает нормально.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Я бы написал ваш HQL-запрос следующим образом:

from R as r
where r.id.col3 = :param and r.col3 = (select max(t.col3) from Table t where t.r = r)

Это предполагает, что сущность T имеет ссылку на сущность R с именем r.Если нет, то измените вышеуказанный код соответствующим образом.

0 голосов
/ 04 февраля 2019

Вы не использовали агрегирующую функцию, поэтому нет необходимости группировать по

SELECT R.*
    FROM Table R
    INNER JOIN (
       SELECT T.id.col1, T.id.col2, MAX(T.col3) max_num
       FROM Table T
       GROUP BY T.id.col1,T.id.col2
    ) b ON R.id.col1 = b.id.col1 AND R.col3 = b.max_num
    WHERE R.id.col3 = :param

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