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

升级Spring Boot后@SqlResultSetMapping映射解析失败问题求助

解决Spring Boot 3.x + Hibernate 6.x下@SqlResultSetMapping无法解析的问题

环境说明

  • 旧版本:Spring Boot 2.4.2(依赖Hibernate 5.4.25.Final)
  • 新版本:Spring Boot 3.3.4(依赖Hibernate 6.6.12.Final)

问题分析与解决方案

1. 检查@SqlResultSetMapping的放置位置

Hibernate 6对映射注解的扫描规则做了严格限制:

  • 必须将@SqlResultSetMapping放在标注了@Entity的实体类上,或者放在package-info.java中用@SqlResultSetMappings包裹
  • 旧版本Hibernate 5允许将映射放在非实体类(如DTO、响应类)上,但Hibernate 6不再支持这种做法,会导致映射无法被扫描识别

2. 修复映射注解的语法错误

你提供的映射代码存在括号未闭合的语法问题,完整的正确写法如下:

@SqlResultSetMapping(name = "SearchResultMapping",
      classes = {
            @ConstructorResult(
                  targetClass = SearchBomResponseEntity.class,
                  columns = {
                        @ColumnResult(name = "xx", type = Long.class),
                        @ColumnResult(name = "xx", type = String.class),
                        @ColumnResult(name = "xxxx", type = Integer.class)
                  }
            )
      }
)

语法错误会直接导致Hibernate无法解析映射定义。

3. 确保映射名称完全匹配

检查调用映射的代码(如createNativeQuery(sql, "SearchResultMapping")),确保映射名称的大小写、拼写完全一致。Hibernate 6对名称匹配的大小写敏感性比旧版本更高。

4. 验证构造方法的兼容性

@ConstructorResult要求目标类SearchBomResponseEntity必须存在与列顺序、类型完全匹配的构造方法:

  • 构造方法的参数数量、类型要和@ColumnResult的定义一一对应
  • 若SQL返回NULL值,参数需使用包装类(如Long、Integer)而非基本类型(long、int)

5. 关联@NamedNativeQuery(可选优化)

如果通过原生SQL调用映射,建议将查询与映射绑定,避免名称匹配问题:

@NamedNativeQuery(
      name = "SearchBomQuery",
      query = "SELECT xx, xx, xxxx FROM your_table WHERE ...", // 你的原生SQL
      resultSetMapping = "SearchResultMapping"
)
@SqlResultSetMapping(...) // 你的映射定义
@Entity
public class YourEntity {
    // 实体类内容
}

调用时使用entityManager.createNamedQuery("SearchBomQuery", SearchBomResponseEntity.class)即可。

内容的提问来源于stack exchange,提问作者Ravi Rao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 13:04:55