Spring Boot 3.0.5(PostgreSQL)JPA查询失败问题求助
Spring Boot 3.0.5 + JDK17 下JPA关联查询ClassCastException问题解决
问题背景
将Spring Boot版本从2.7.2升级到3.0.5、JDK从11升级到17后,使用PostgreSQL数据库时,JPARepository的关联查询抛出ClassCastException,具体代码和异常如下:
查询代码
@Query(value = "select ls.col1 from Sttaus ls right join ls.col2 al on ls.col2= al.id " + "where ls.status is null and al.Key = Key " + "order by al.lastUpdatedAt") Slice<Sttaus> getDetails(@Param("Key") String Key, Pageable pageable);
异常信息
java.lang.ClassCastException: class org.hibernate.metamodel.mapping.internal.BasicAttributeMapping cannot be cast to class org.hibernate.metamodel.mapping.EntityValuedModelPart (org.hibernate.metamodel.mapping.internal.BasicAttributeMapping and org.hibernate.metamodel.mapping.EntityValuedModelPart are in unnamed module of loader 'app') at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitTableGroup(BaseSqmToSqlAstConverter.java:3505) at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitQualifiedAttributeJoin(BaseSqmToSqlAstConverter.java:3440) at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitQualifiedAttributeJoin(BaseSqmToSqlAstConverter.java:416)
问题分析及解决方案
Spring Boot 3.0.5(对应Hibernate 6.x)完全支持关联查询,问题出在JPQL写法的几个错误上:
返回类型与查询结果不匹配
你选择的是ls.col1(单个字段),但方法返回类型是Slice<Sttaus>(实体类集合),类型不匹配直接导致转换异常。需根据实际需求调整:- 若要返回
Sttaus实体,将select子句改为select ls; - 若要返回
col1字段,将返回类型改为Slice<Col1对应的类型>(比如Slice<String>)。
- 若要返回
关联写法错误
JPA中实体关联(如ls.col2)已经通过注解维护了外键关系,无需手动写on ls.col2= al.id,手动指定on条件会干扰Hibernate 6.x的解析逻辑,引发映射转换错误。正确的关联写法只需right join ls.col2 al。参数引用错误
JPQL中引用@Param标注的参数需要加冒号:Key,否则会被解析为实体字段名,导致条件失效。
修正后的代码示例
示例1:返回Sttaus实体
@Query(value = "select ls from Sttaus ls right join ls.col2 al " + "where ls.status is null and al.Key = :Key " + "order by al.lastUpdatedAt") Slice<Sttaus> getDetails(@Param("Key") String Key, Pageable pageable);
示例2:返回col1字段
@Query(value = "select ls.col1 from Sttaus ls right join ls.col2 al " + "where ls.status is null and al.Key = :Key " + "order by al.lastUpdatedAt") Slice<String> getDetails(@Param("Key") String Key, Pageable pageable);
总结
Hibernate 6.x对JPQL的解析比旧版本更严格,需严格遵循JPA规范写法:保证返回类型与查询结果一致,依赖实体关联注解维护join条件,正确引用参数。调整后即可解决该ClassCastException问题。
内容的提问来源于stack exchange,提问作者Jayashree Madanala
相关产品推荐
相关产品推荐

