Hibernate查询异常:查询Articulo却使用ArticuloCI导致属性缺失
解决Hibernate单表继承下父类查询子类属性缺失的异常
问题原因
你使用了Hibernate的单表继承策略,Articulo和其子类ArticuloCI共用articulos表。执行from Articulo的HQL查询时,Hibernate默认会返回所有属于Articulo及其子类的记录,包括ArticuloCI实例。但ArticuloCI未映射descripcion属性,当Hibernate尝试实例化ArticuloCI并访问该属性时,就会抛出“不存在descripcion属性”的异常。
解决方案
1. 限制HQL查询仅返回父类实例
在HQL中通过class语法或鉴别器列过滤,只查询Articulo本身的记录:
from com.ansal.entities.Articulo a WHERE a.class = com.ansal.entities.Articulo AND (a.descripcion is null OR a.descripcion = '')
或者直接使用鉴别器值(替换为你实际的鉴别器列名和值):
from com.ansal.entities.Articulo a WHERE a.discriminator_col = 'ARTICULO' AND (a.descripcion is null OR a.descripcion = '')
a.class是HQL的内置语法,会自动转换为对应鉴别器列的过滤条件。
2. 给ArticuloCI添加descripcion属性映射
如果业务逻辑允许,在ArticuloCI的映射文件中添加与Articulo一致的descripcion属性映射:
<property name="descripcion" column="descripcion" type="string"/>
由于共用同一张表,该属性对应同一数据库列,不会产生数据冲突,同时能让ArticuloCI实例正常访问该属性。
3. 修改父类映射的多态查询策略
在Articulo的映射文件中配置polymorphism="explicit",强制Hibernate仅查询父类实例,不自动包含子类:
<class name="com.ansal.entities.Articulo" table="articulos" polymorphism="explicit"> <!-- 原有属性、鉴别器等配置 --> </class>
此配置会改变父类查询的默认行为,仅返回Articulo类型的实例,避免实例化ArticuloCI导致的属性缺失问题。
内容的提问来源于stack exchange,提问作者Luis Fernando Serio Faraldo
相关产品推荐
相关产品推荐

