迁移至Spring Boot 3后JPA查询出现类型转换异常问题
解决Spring Boot 3.0.4中JPA查询List参数的类型转换异常
异常原因
迁移到Spring Boot 3.0.4后,Hibernate 6对参数类型的校验变得更严格。原查询中使用coalesce(:users,1)='1'试图判断List参数是否为空的逻辑存在问题:coalesce函数会尝试将ArrayList类型的:users参数转换为String类型,而Hibernate无法完成这个转换,因此抛出类型转换异常。
修复方案
使用Spring Data JPA支持的SpEL表达式直接判断List参数是否为空或空集合,替换原有的coalesce逻辑,避免类型转换错误。同时修正number参数的空值判断语法,符合JPQL规范。
修改后的查询代码如下:
@Query(value ="select s from table s where " + "(:#{#users == null or #users.isEmpty()} or s.user in :users) and " + "(:#{#employees == null or #employees.isEmpty()} or s.employee in :employees) and " + "(:number is null or s.salary=:number)") List<TableEntity> findTable(@Param("users") List<String> users, @Param("employees") List<String> employees, @Param("number") Long number, Pageable paging);
逻辑说明
:#{#users == null or #users.isEmpty()}:在查询执行前通过SpEL判断users参数是否为空或空集合,满足条件时该分支为真,直接跳过in子句的校验- 当
users参数有效时,才会执行s.user in :users的条件判断 - 同理处理
employees参数,number参数采用JPQL标准的:number is null语法判断空值
内容的提问来源于stack exchange,提问作者Thejas
相关产品推荐
相关产品推荐

