【问题标题】:Criteria query returns child objects rather parent object that was requested条件查询返回子对象而不是请求的父对象
【发布时间】:2012-10-16 20:33:28
【问题描述】:

我的休眠条件查询有问题。我有:

DetachedCriteria carCriteria = DetachedCriteria.forClass(Car.class);
List<Car> cars = getHibernateTemplate().findByCriteria(carCriteria);

for(Car car : cars) {
System.out.println("class type " + car.getClass());
}

上面打印了类类型 model.FourByFour,其中 FourByFour 扩展了 Car。因为我在 DetachedCriteria 中指定了 Car 类,所以我希望类类型是 Car 而不是 FourByFour。

映射(简化):

<hibernate-mapping default-access="field" default-lazy="true" package="model">
<class name="model.Vehicle" table="VEHICLE">
<id column="VEHICLE_ID" name="id" type="long">
    <generator class="native" />
</id>

    ...

    <joined-subclass extends="model.Vehicle" name="model.Car" table="CAR">
    <key column="VEHICLE_ID" />
        ....
        <joined-subclass extends="model.Car" name="model.FourByFour" table="FOUR_BY_FOUR">
    <key column="VEHICLE_ID" />
    </joined-subclass>
</joined-subclass>
</class>

如何使条件查询返回的对象成为 Car 对象而不是 FourByFour 对象?

【问题讨论】:

    标签: hibernate mapping hibernate-criteria


    【解决方案1】:

    您请求汽车,并且由于 FourByFour 扩展了 Car,FourByFour 汽车,因此查询也返回了 FourByFour 实例。 Hibernate 查询是多态的。就像您去汽车商店时,他们会向您展示他们所有的汽车,即使它们是 SUV、Monospaces 或混合动力汽车。

    要限制到特定的类实例,您必须添加一个附加条件:

    carCriteria.add(Restrictions.eq("class", Car.class));
    

    【讨论】:

    • 有道理!我已经添加了这个,但返回了 0 个结果。 “类”属性名称是实际的属性名称还是应该用其他名称替换?
    • 不,类是正确的属性。检查生成的 SQL,并检查您的数据库中是否确实有汽车不是 Car 的任何子类的实例。
    • 就是这样!我有 Car 的子类的实例——非常感谢您的帮助!也超级快!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多