Criteria查询使用特定子类查找行

时间:2012-05-22 13:25:52

标签: java hibernate criteria table-per-subclass

我将从一个消毒的例子开始。

在我的系统中,我有班级汽车。 Car有许多领域,其中包括GearShift类的gearShift实例。

public class Car {
    private GearShift gearShift;

    // Snip
}

GearShift是一个抽象类,AutomaticShift和StickShift从中继承。这在Hibernate中映射为table-per-subclass。

现在,我想要让自动换档的汽车。我更喜欢通过Hibernate标准来做这件事,所以我想象一下我可以添加的“ofType”限制,如下所示。

getSession().createCriteria(Car.class)
    .add(Restrictions.ofType(AutomaticShift.class)
    .list();

这有可能吗?

2 个答案:

答案 0 :(得分:9)

OLD:

这个怎么样?

getSession().createCriteria(AutomaticShift.class).list()

修改

这应该可以解决问题;

getSession().createCriteria(Car.class).createAlias("gearShift", "gs").add(Restrictions.eq("gs.class", AutomaticShift.class)).list();

答案 1 :(得分:0)

也许这听起来有点像开销,但你可以分两步完成:

  1. 检索自动齿轮的所有ID:

    List<Long> automaticGearIds = getSession().createCriteria(AutomaticShift.class)
                                            .setProjection(Projections.distinct(Property.forName("id")))
                                            .list();
    
  2. 让所有汽车都配备自动档位:

    return getSession().createCriteria(Car.class).add(Restrictions.in("gearShift.id", automaticGearIds)).list();