Spring Boot 3.1.2升级后原生TRUNCATE查询触发HQL解析错误
问题分析与解决方案:Spring Boot 3.1.x中原生TRUNCATE查询被HQL解析器报错
问题本质
这不是Bug,你的排查方向准确。核心原因是Spring Data 2023.0(Ullman)版本引入的查询预解析校验特性:当类路径中存在Hibernate Validator时,该特性会对所有Repository查询(包括标记为nativeQuery=true的原生查询)执行JPQL语法校验,而TRUNCATE属于原生SQL语法,不符合JPQL规范,因此被HQL Parser判定为语法错误。
解决方案
有两种方式可以解决这个问题:
方式一:禁用单个Repository的查询校验
在你的Repository接口上添加@QueryParsingValidation(disabled = true)注解,跳过该接口下所有查询的语法校验:@QueryParsingValidation(disabled = true) public interface YourRepository extends JpaRepository<YourEntity, Long> { @Query(value = "TRUNCATE TABLE #{#entityName}", nativeQuery = true) @Modifying void truncateTable(); }方式二:全局禁用查询校验
在项目配置文件中添加参数,关闭全局的JPQL语法校验逻辑:# application.properties spring.data.jpa.query.parsing.validation.enabled=false
补充说明
Spring Data 2023.0的查询校验特性原本是为了提前发现JPQL语法错误,但对原生查询的场景考虑不足,导致标记为原生查询的SQL语句被误校验。通过上述两种方式禁用校验后,原生查询会恢复Spring Boot 3.0.x版本的执行逻辑,正常运行TRUNCATE语句。
内容的提问来源于stack exchange,提问作者Holipop
相关产品推荐
相关产品推荐

