2010-01-22 64 views
1

考虑以下三种休眠实体:控制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。

回答

0

经过大量的研究看来,这是不可能在这个阶段,至少不延长休眠。

0

是的,你可以使用它标准,但我不记得如何做,只是看在连接标准,但是我会建议使用HQL,而标准做的是更具可读性:

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

我有正当的理由需要使用Criteria做到这一点,除非绝对必要,否则我现在不想进入。另外,在你的HQL解决方案中,当Hibernate.initialize(car.getWheels())被调用时,它将不会被“自动”应用,除非我弄错了。 – Zecrates 2010-01-24 09:06:05

+0

在HQL中使用“连接提取”将会加载轮子收集,并且您不需要调用Hibernate.initialize()...尝试启用标志view_sql并检查生成的查询和不用部分**加入获取c.wheels ** – 2010-01-24 10:56:26

+0

问题是我需要使用子选择为了避免笛卡尔连接,因为在我的实际实体中我有多个OneToMany关系需要加载。 – Zecrates 2010-01-25 10:06:27