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
相关产品推荐
相关产品推荐

