You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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写法的几个错误上:

  1. 返回类型与查询结果不匹配
    你选择的是ls.col1(单个字段),但方法返回类型是Slice<Sttaus>(实体类集合),类型不匹配直接导致转换异常。需根据实际需求调整:

    • 若要返回Sttaus实体,将select子句改为select ls;
    • 若要返回col1字段,将返回类型改为Slice<Col1对应的类型>(比如Slice<String>)。
  2. 关联写法错误
    JPA中实体关联(如ls.col2)已经通过注解维护了外键关系,无需手动写on ls.col2= al.id,手动指定on条件会干扰Hibernate 6.x的解析逻辑,引发映射转换错误。正确的关联写法只需right join ls.col2 al。

  3. 参数引用错误
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 12:10:29