2010-01-22 2 views
1

Рассмотрим следующие три 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.

ответ

0

После большого количества исследований, оказалось, что это невозможно на данном этапе, по крайней мере, без расширения Hibernate.

0

Да, вы можете сделать это с помощью критериев, но я не помню, как его сделать, просто посмотрите присоединяется к критериям, однако я предлагаю использовать HQL скорее критерии гораздо более удобным для чтения:

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

У меня есть веские причины для того, чтобы сделать это с помощью критериев, которые я бы предпочел не получить прямо сейчас, если это абсолютно необходимо. Кроме того, с вашим решением HQL оно не будет применяться «автоматически», когда вызывается Hibernate.initialize (car.getWheels()), если я не ошибаюсь? – Zecrates

+0

Использование «join fetch» ​​в HQL будет загружать коллекцию колес с нетерпением, и вам не нужно будет вызывать Hibernate.initialize() ... попытаться включить флаг view_sql и проверить разницу в запросе, сгенерированном с помощью и без part ** join fetch c.wheels ** –

+0

Проблема в том, что мне нужно использовать подзапросы, чтобы избежать декартового объединения, так как в моей фактической сущности у меня есть несколько отношений OneToMany, которые необходимо загрузить. – Zecrates