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

Spring/Hibernate升级后出现PositionalParameterSpecification空指针错误求助

Hibernate升级后NullPointerException问题分析与解决

问题场景

Spring/Hibernate版本升级后,执行DAO方法时出现以下NullPointerException:

java.lang.NullPointerException: null
    at org.hibernate.param.PositionalParameterSpecification.bind(PositionalParameterSpecification.java:55) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:682) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.loader.Loader.bindPreparedStatement(Loader.java:2150) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:2127) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2059) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2037) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]

对应的DAO方法代码:

@Query("select s from TraineeSearch s where s.trainDirectorNedId=?1 and s.nedId in?2 and s.plan IS NOT NULL and s.currentPlan ='Y'")
List<TraineeSearch> getTerminatedTrainees(String nedId,List<String> nedIds);

错误含义

该空指针是因为Hibernate 5.6+版本对HQL语法校验更严格,DAO方法的HQL中in?2的写法存在语法问题——in关键字与位置参数?2之间缺少空格,导致Hibernate无法正确解析位置参数,生成的PositionalParameterSpecification对象为空,最终在参数绑定阶段触发NullPointerException。

另外,如果传入的nedIds参数为null,新版本Hibernate对空集合/空参数的处理逻辑也比旧版本更严格,可能加剧该问题。

解决方法

  • 修正HQL语法:在in和?2之间添加空格,确保Hibernate能正确识别位置参数,修正后的代码如下:
    @Query("select s from TraineeSearch s where s.trainDirectorNedId=?1 and s.nedId in ?2 and s.plan IS NOT NULL and s.currentPlan ='Y'")
    List<TraineeSearch> getTerminatedTrainees(String nedId,List<String> nedIds);
    
  • 校验输入参数:确保调用getTerminatedTrainees方法时,nedIds参数不为null且不为空集合。如果业务允许nedIds为空,可以在HQL中添加空值判断逻辑:
    @Query("select s from TraineeSearch s where s.trainDirectorNedId=?1 and (?2 is empty or s.nedId in ?2) and s.plan IS NOT NULL and s.currentPlan ='Y'")
    List<TraineeSearch> getTerminatedTrainees(String nedId,List<String> nedIds);
    

内容的提问来源于stack exchange,提问作者gene b.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:42:09