Hibernate 控制休眠';s生成的子选择

Hibernate 控制休眠';s生成的子选择,hibernate,criteria,subquery,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 Hubc

考虑以下三个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 {

}
公车{
@OneToMany(fetch=FetchType.LAZY)
@Fetch(FetchMode.SUBSELECT)
私有列表轮;
}
公共级车轮{
@OneToOne(fetch=FetchType.LAZY)
私人轮毂盖轮毂盖;
}
公共级轮毂盖{
}
考虑以下标准:

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

for (Car car : cars) {
  Hibernate.initialize(car.getWheels());
}
Criteria=getSession().createCriteria(Car.class);
列出车辆=标准。列表();
用于(汽车:汽车){
初始化(car.getWheels());
}
是否有任何方法可以控制将生成的子选择查询?具体来说,我希望加入子选择,以便在提取车轮时也提取轮毂盖。当然,这可以通过将FetchType更改为EAGER来实现,但是我需要一些更特别的东西——在逐个查询的基础上


由于代码当前处于运行状态,我需要生成另一个select来获取轮毂盖。

是的,您可以使用条件来实现,但我不记得它是如何实现的,只需在条件中查找联接,但是我建议使用HQL,而条件更具可读性:

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

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


经过大量研究,目前看来这是不可能的,至少在不扩展Hibernate的情况下是不可能的。

我有充分的理由需要使用标准来完成这项工作,除非绝对必要,否则我现在不想进入标准。此外,在HQL解决方案中,当调用Hibernate.initialize(car.getWheels())时,它不会“自动”应用,除非我弄错了?在HQL中使用“join fetch”将急切地加载wheels集合,并且您不需要调用Hibernate.initialize()。。。尝试启用标志视图\ U sql并检查使用和不使用part join fetch c.Wheels生成的查询中的差异。问题是我需要使用subselect以避免笛卡尔连接,因为在我的实际实体中,我有多个需要加载的OneToMany关系。这不会影响生成的subselect查询。