Hibernate 6.2升级后@SqlResultSetMapping+@ConstructorResult映射失败
Hibernate 6.2 升级后 @SqlResultSetMapping 映射失效的解决办法
问题根源
升级到Hibernate 6.2后,原生查询的结果映射改用DynamicInstantiationAssemblerInjectionImpl处理,这个类内部调用Class.findField()——这个方法对字段名大小写是严格匹配的,而旧版Hibernate在这方面兼容性更强,能自动适配大小写差异。你的查询返回列是FIRST_NAME,但PersonPOJO里的字段大概率是驼峰格式(比如firstName)或者小写下划线格式(first_name),导致找不到对应字段,抛出Cannot set field "FIRST_NAME" to instantiate异常。
两种修复方式
1. 修改查询语句的列别名,对齐POJO字段名
直接给查询的列加别名,让别名和POJO的字段名(大小写完全一致)匹配。比如POJO字段是firstName,查询改成:
SELECT FIRST_NAME AS firstName FROM PERSON
如果POJO字段是first_name,则写成:
SELECT FIRST_NAME AS first_name FROM PERSON
2. 在@ColumnResult里显式绑定列名和字段名
在@SqlResultSetMapping的@ConstructorResult中,通过@ColumnResult的name指定查询返回的列名,property指定POJO的字段名(必须大小写完全匹配)。示例代码:
@SqlResultSetMapping( name = "MAPPING_PERSON", classes = @ConstructorResult( targetClass = PersonPOJO.class, columns = @ColumnResult(name = "FIRST_NAME", property = "firstName") ) ) @Entity public class Person { // 实体原有代码 }
额外注意点
- 确保PersonPOJO的字段可被反射访问:如果是私有字段,要么加对应的setter方法,要么把字段设为public,或者给POJO加
@Access(AccessType.FIELD)注解让Hibernate直接操作字段。 - 如果用的是构造方法注入(而非字段注入),要确认@ConstructorResult里的列顺序、类型和POJO构造方法的参数顺序、类型完全一致,不然也会触发异常。
内容的提问来源于stack exchange,提问作者Spider
相关产品推荐
相关产品推荐

