Blaze Persistence CTE查询抛出QuerySqmImpl相关ClassCastException问题
遇到这个问题大概率是Blaze Persistence与Hibernate的版本兼容性不匹配导致的,咱们结合你的场景来分析:
问题根源
你的项目用的是Spring Boot 3.2.2,这个版本默认集成的是Hibernate 6.4.x,但你引入的Blaze Persistence集成依赖是blaze-persistence-integration-hibernate-6.2——这个依赖是专门适配Hibernate 6.2版本的。Hibernate 6.2到6.4的内部API(比如QuerySqmImpl类的结构、代理生成逻辑)发生了变化,导致Blaze Persistence在尝试转换查询对象时出现类型转换失败。
解决方案
你可以从以下两个方向解决:
方案1:升级Blaze Persistence版本以适配Hibernate 6.4
Blaze Persistence从1.6.12版本开始支持Hibernate 6.4,你需要做两步调整:
- 将
blaze-persistence.version改为1.6.12或更高版本 - 把Hibernate集成依赖替换为适配6.4的版本:
<dependency> <groupId>com.blazebit</groupId> <artifactId>blaze-persistence-integration-hibernate-6.4</artifactId> <scope>runtime</scope> </dependency>
方案2:降级Spring Boot版本以匹配现有Blaze Persistence依赖
如果你暂时不想升级Blaze Persistence,可以将Spring Boot版本降级到3.1.x系列,这个版本默认集成的是Hibernate 6.2,和你当前用的blaze-persistence-integration-hibernate-6.2完全兼容。
额外检查点
确认所有Blaze Persistence依赖都是jakarta后缀的(比如你用的blaze-persistence-core-api-jakarta),这和Spring Boot 3基于Jakarta EE的环境是匹配的,这部分你已经做对了。
如果调整版本后还是出现问题,可以检查项目中是否存在冲突的Hibernate依赖,确保Spring Boot自动引入的Hibernate版本和你需要的版本一致。
备注:内容来源于stack exchange,提问作者François Vanhille

