Рассмотрим следующие три Hibernate сущности:Контроллинг библиотеки 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, но мне нужно что-то более ad hoc - по запросу по запросу.
В качестве кода в настоящее время мне нужно будет сгенерировать еще один выбор, чтобы получить Hubcaps.
У меня есть веские причины для того, чтобы сделать это с помощью критериев, которые я бы предпочел не получить прямо сейчас, если это абсолютно необходимо. Кроме того, с вашим решением HQL оно не будет применяться «автоматически», когда вызывается Hibernate.initialize (car.getWheels()), если я не ошибаюсь? – Zecrates
Использование «join fetch» в HQL будет загружать коллекцию колес с нетерпением, и вам не нужно будет вызывать Hibernate.initialize() ... попытаться включить флаг view_sql и проверить разницу в запросе, сгенерированном с помощью и без part ** join fetch c.wheels ** –
Проблема в том, что мне нужно использовать подзапросы, чтобы избежать декартового объединения, так как в моей фактической сущности у меня есть несколько отношений OneToMany, которые необходимо загрузить. – Zecrates