控制Hibernate生成的subselect

时间:2010-01-22 10:33:21

标签: hibernate criteria subquery

考虑以下三个Hibernate实体:

public class Car {

  @OneToMany(fetch = FetchType.LAZY)
  @Fetch(FetchMode.SUBSELECT)
  private List<Wheel> wheels;

}

public class Wheel {

  @OneToOne(fetch = FetchType.LAZY)
  private Hubcap hubcap;

}

public class Hubcap {

}

考虑以下标准:

Criteria criteria = getSession().createCriteria(Car.class);
List<Car> cars = criteria.list();

for (Car car : cars) {
  Hibernate.initialize(car.getWheels());
}

有没有办法控制将生成的子选择查询?具体来说,我想加入subselect,以便在获取轮子时也可以获取轮毂盖。这当然可以通过将FetchType更改为EAGER来实现,但我需要一些更特别的东西 - 在逐个查询的基础上。

由于代码目前我需要生成另一个选择来获取Hubcaps。

3 个答案:

答案 0 :(得分:0)

是的,你可以使用标准来做,但我不记得它是如何完成的,只是在条件中寻找连接,但我建议使用HQL而不是Criteria更具可读性:

select c 
from Car c join fetch c.wheels
where ...

答案 1 :(得分:0)

您可以使用setFetchMode方法更改条件查询中的获取类型。

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querycriteria.html

答案 2 :(得分:0)

经过大量研究后,似乎在现阶段这是不可能的,至少在没有扩展Hibernate的情况下。