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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 23:55:08