【问题标题】:Perform Inner Join on a subquery that has more than one column, in HQL?在 HQL 中对具有多个列的子查询执行内部联接?
【发布时间】:2019-06-28 04:48:18
【问题描述】:

我正在尝试在 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 版本可以正常工作。

【问题讨论】:

    标签: mysql sql hibernate hql


    【解决方案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
    

    【讨论】:

    • 在正确的轨道上,但这不是有效的 HQL 语法 AFAIK。此外,您已经更改了聚合子查询,从而改变了 OP 的含义。我认为当前版本是正确的。
    【解决方案2】:

    我会这样写你的 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 实体具有对名为 rR 实体的引用。如果不是,则相应地更改上面的代码。

    【讨论】:

    • 在上面的问题中,只有1个实体,R和T是Table(虚拟表名)的别名
    猜你喜欢
    • 2018-09-14
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 2018-03-09
    • 2018-06-19
    • 1970-01-01
    相关资源
    最近更新 更多