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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:54:03