升级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
相关产品推荐
相关产品推荐

