You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL Workbench可运行的Hibernate查询执行时抛出QuerySyntaxException

问题根因

你遇到的报错核心原因是 HQL(Hibernate 查询语言)在低于6的版本中,不支持在JOIN子句后直接关联子查询,只有原生SQL支持该语法。你直接将原生SQL的逻辑套用到HQL写法中,就会触发语法解析时的unexpected token: (异常。

可行解决方案

方案1:改用原生查询执行(最快适配)

你已经有跑通的MySQL原生SQL,直接把@NamedQuery换成@NamedNativeQuery即可,示例代码如下:

@NamedNativeQuery(
    name = "FseLiveLocation.findByMultipleIds",
    query = "select f.* from fse_live_location f join (SELECT max(fl.id) as ide FROM fse_live_location fl WHERE fl.fse_info_id IN (:fseInfoList) GROUP BY fl.fse_info_id) as j on f.id=j.ide",
    resultClass = FseLiveLocation.class
)

注意要根据你的实际表结构、字段名调整SQL里的下划线命名,确保和数据库实际字段一致。

方案2:改写为合法HQL语法(兼容所有Hibernate版本、跨数据库)

不用JOIN关联子查询,改为用IN子句匹配最大id即可,HQL支持在IN后接子查询,改写后的@NamedQuery如下:

@NamedQuery(
    name = "FseLiveLocation.findByMultipleIds", 
    query = "SELECT f FROM FseLiveLocation f WHERE f.id IN (SELECT max(fl.id) FROM FseLiveLocation fl WHERE fl.fseInfoId IN (:fseInfoList) GROUP BY fl.fseInfoId)"
)

这个写法和你原逻辑的执行效果完全一致,且符合所有版本HQL的语法规范。

方案3:升级Hibernate版本

如果你的项目可升级依赖,将Hibernate升级到6及以上版本,该版本开始支持JOIN后关联子查询的语法,原HQL不用修改就能直接运行。

内容的提问来源于stack exchange,提问作者Aayushi Pandey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 22:36:02