1

我对休眠条件查询有疑问。我有:

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 对象?

4

1 回答 1

0

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

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

carCriteria.add(Restrictions.eq("class", Car.class));
于 2012-10-16T20:52:32.670 回答