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

