Hibernate 6查询父类原生SQL报ORA-17006无效列名错误
解决Hibernate 6中JOINED继承下原生查询映射父类的问题
核心原因
Hibernate 6对继承映射的原生查询处理逻辑做了调整:默认会尝试关联所有子类的属性进行映射,哪怕你的原生SQL只查询了父表(POINTS)的数据,这就导致它去查找子类表(REFERENTIALS)的列,最终抛出ORA-17006: Invalid column name错误。
具体解决方案
1. 用addEntity明确指定父类实体
创建原生查询时,通过addEntity显式告诉Hibernate只映射父类Point,不要加载子类属性:
String nativeSql = "SELECT * FROM POINTS WHERE id = ?"; Query<Point> query = entityManager.createNativeQuery(nativeSql, Point.class) .addEntity(Point.class); // 关键:指定仅映射父类 Point result = query.setParameter(1, pointId).getSingleResult();
2. 使用构造函数投影
如果只需要父类的部分属性,用构造函数映射查询结果,绕开Hibernate的自动继承映射:
先在Point类中添加对应查询字段的构造函数:
public Point(Long id, String pointName, Date createTime) { this.id = id; this.pointName = pointName; this.createTime = createTime; }
然后在查询中调用构造函数:
String nativeSql = "SELECT id, point_name, create_time FROM POINTS WHERE id = ?"; Query<Point> query = entityManager.createNativeQuery(nativeSql) .setResultTransformer(Transformers.aliasToBean(Point.class)); Point result = query.setParameter(1, pointId).getSingleResult();
3. 定义@SqlResultSetMapping精准控制映射
在父类Point上定义专属的结果集映射,明确只映射父类列:
@Entity @Table(name = "POINTS") @Inheritance(strategy = InheritanceType.JOINED) @SqlResultSetMapping( name = "PointOnlyMapping", entities = @EntityResult( entityClass = Point.class, fields = { @FieldResult(name = "id", column = "ID"), @FieldResult(name = "pointName", column = "POINT_NAME") // 按需添加其他父类字段 } ) ) public class Point { // 父类属性与映射逻辑 }
查询时指定该映射:
String nativeSql = "SELECT * FROM POINTS WHERE id = ?"; Query<Point> query = entityManager.createNativeQuery(nativeSql, "PointOnlyMapping"); Point result = query.setParameter(1, pointId).getSingleResult();
4. 临时禁用子类映射(应急用)
如果以上方法不适用,可通过Hibernate专属hint临时禁用子类加载(不推荐长期使用):
String nativeSql = "SELECT * FROM POINTS WHERE id = ?"; NativeQuery<Point> nativeQuery = entityManager.unwrap(Session.class) .createNativeQuery(nativeSql, Point.class); nativeQuery.setParameter(1, pointId); nativeQuery.setHint("hibernate.query.include_subclasses", false); Point result = nativeQuery.getSingleResult();
内容的提问来源于stack exchange,提问作者Maksson
相关产品推荐
相关产品推荐

