在HQL中对具有多个列的子查询执行内部联接吗?

时间:2019-02-04 12:35:30

标签: mysql sql hibernate hql

我正在尝试使用HQL中的子查询(子查询返回3列结果)联接表,但出现语法错误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 :(得分:1)

您尚未使用任何汇总函数,因此无需分组依据

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

答案 1 :(得分:0)

我会这样写您的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的{​​{1}}实体的引用。如果没有,请相应地更改上面的代码。