Criteria查询返回子对象而不是请求的父对象

时间:2012-10-16 20:33:29

标签: hibernate mapping hibernate-criteria

我遇到了hibernate条件查询的问题。我有:

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

1 个答案:

答案 0 :(得分:0)

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

要限制到特定的类实例,您必须添加其他标准:

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