Hibernate运行HQL查询抛出unexpected token: null异常如何解决?
报错信息:java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: null near line 1, column 226
问题HQL:SELECT COUNT(*) FROM com.pmp.vupadhi.model.EmpLeave WHERE ((start_date >=:startdate AND start_date <=:enddate) OR (end_date >=:startdate AND end_date <=:enddate)) AND em_id =:id AND (leave_status !=103 AND leave_status !=104
异常触发原因
- 最直接的语法错误:HQL末尾的
(leave_status !=103 AND leave_status !=104缺少右括号闭合,导致HQL解析器解析到语句末尾时识别到不完整的语法结构,抛出token异常。 - 绑定参数为null:
:startdate、:enddate、:id三个占位符中任意一个在执行查询前未赋值、传入了null值,解析器无法识别null占位符的语法含义触发报错。 - 字段名不匹配:HQL中使用的
start_date、end_date、em_id等字段名和EmpLeave实体类的属性名不一致(比如实体类使用驼峰命名startDate),HQL是面向实体属性的查询语言,无法识别非实体属性的字段名。 - 语法混用:把原生SQL的表字段写法直接用到HQL中,没有对应实体属性映射,也会触发解析异常。
排查修复方案
- 第一步先补全HQL的语法缺失,添加缺失的右括号,修正后的基础HQL如下:
SELECT COUNT(*) FROM com.pmp.vupadhi.model.EmpLeave WHERE ((start_date >=:startdate AND start_date <=:enddate) OR (end_date >=:startdate AND end_date <=:enddate)) AND em_id =:id AND (leave_status !=103 AND leave_status !=104)
- 打印所有查询参数的赋值日志,确认三个占位符都被赋予了非null的有效值。如果业务允许参数为空,调整HQL逻辑兼容null场景,示例如下:
AND (:startdate is null OR start_date >=:startdate) AND (:enddate is null OR start_date <=:enddate)
- 核对
EmpLeave实体类的属性定义,把HQL中的字段名替换为和实体类完全一致的属性名,比如下划线命名改为驼峰命名startDate、endDate、emId。 - 如果需要直接使用数据库表字段查询,改用原生SQL接口执行,调用
createNativeQuery方法而非createQuery方法。 - 定位问题时可以先把占位符替换为固定测试值,验证语句可正常执行后再逐步替换为参数绑定写法,缩小问题范围。
内容的提问来源于stack exchange,提问作者Srinivasulu Ch
相关产品推荐
相关产品推荐

