考虑以下三种休眠实体:控制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());
}
有什么办法来控制将要产生的子查询的查询?具体而言,我希望加入子选择,以便轮胎抓取时也可以抓取轮毂。这当然可以通过将FetchType更改为EAGER来完成,但我需要一些更加特殊的东西 - 按查询进行查询。
由于代码是目前我需要生成另一个选择来获取Hubcap。
我有正当的理由需要使用Criteria做到这一点,除非绝对必要,否则我现在不想进入。另外,在你的HQL解决方案中,当Hibernate.initialize(car.getWheels())被调用时,它将不会被“自动”应用,除非我弄错了。 – Zecrates 2010-01-24 09:06:05
在HQL中使用“连接提取”将会加载轮子收集,并且您不需要调用Hibernate.initialize()...尝试启用标志view_sql并检查生成的查询和不用部分**加入获取c.wheels ** – 2010-01-24 10:56:26
问题是我需要使用子选择为了避免笛卡尔连接,因为在我的实际实体中我有多个OneToMany关系需要加载。 – Zecrates 2010-01-25 10:06:27