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

HQL查询遇unexpected token:on错误,含多关联与列表参数需求求解

搞定HQL的QuerySyntaxException: unexpected token: on错误

嗨,我一眼就看出你这段HQL的问题所在了——连续用了两个on关键字,而且多表关联的写法完全不符合HQL的语法规范,这才导致了报错。

问题出在哪?

你原查询的这段代码:

SELECT s,c from Sow s left join ChildSow c 
inner join Project p on p.projectId = s.projectId on s.employeeId = c.employeeId 
and s.projectId = c.correctProjectId

这里有两个明显的错误:

  • left join ChildSow c之后没立刻写关联条件,反而先去join了Project,然后硬生生堆了两个on,HQL根本不认这种写法
  • 每个join操作都得对应自己的关联条件,不同join的条件不能混在一起用多个on堆叠

给你改好的正确写法

根据你的需求(Sow左连ChildSow,同时Sow内连Project),正确的HQL应该这么写:

Query query = em.createQuery(
 " SELECT s,c from Sow s " +
 " inner join Project p on p.projectId = s.projectId " +
 " left join ChildSow c on s.employeeId = c.employeeId and s.projectId = c.correctProjectId ");

要是你的实体类已经配置了关联关系(比如Sow和ChildSow、Sow和Project之间有@OneToMany/@ManyToOne这类注解),还能写得更简洁:

// 假设Sow实体里有project属性关联Project,childSows属性关联ChildSow
Query query = em.createQuery(
 " SELECT s,c from Sow s " +
 " inner join s.project p " +
 " left join s.childSows c ");

再啰嗦两句注意点

  • HQL的join逻辑和SQL类似,但更偏向实体间的关联关系,用实体里配置好的关联属性来join,不仅代码更干净,还不容易踩语法坑
  • 不管是inner join还是left join,每个join都得单独处理自己的on条件(如果是显式写条件的话),绝对不能把多个join的条件堆在一块用多个on

内容的提问来源于stack exchange,提问作者Mr Ajay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 17:32:36