【问题标题】:Criteria query looking for rows using a specific subclass使用特定子类查找行的条件查询
【发布时间】:2012-05-22 13:25:51
【问题描述】:

我将从一个经过消毒的示例开始。

在我的系统中,我有 Car 类。 Car 有很多字段,其中有 GearShift 类的 gearShift 实例。

public class Car {
    private GearShift gearShift;

    // Snip
}

GearShift 是一个抽象类,AutomaticShift 和 StickShift 继承自该类。这在 Hibernate 中映射为每个子类的表。

现在,假设我想购买具有自动换档功能的汽车。我更喜欢通过 Hibernate 标准执行此操作,所以我想像可以添加一个“ofType”限制,如下所示。

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

这有可能吗?

【问题讨论】:

  • 你的映射怎么样?你使用鉴别器吗?
  • 为什么不能使用 HQL? Criteria API 不公开完整的 Hibernate 功能。

标签: java hibernate criteria table-per-subclass


【解决方案1】:

旧:

这个怎么样?

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

编辑:

这应该可以解决问题;

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

【讨论】:

  • 这只会返回一个自动齿轮列表。 -1 为这个
  • @RaulGogo:这就是我虽然他想做的事情:S 你理解不同吗?
  • 他想要一份带有自动档的汽车列表。
【解决方案2】:

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

  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();
    

【讨论】:

  • 在这种情况下使用 Restrictions.in 是一种不好的做法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-13
  • 2019-06-01
  • 1970-01-01
  • 2021-03-08
  • 1970-01-01
相关资源
最近更新 更多