Вопрос

Это может быть супер легким ответом, так как я уверен, что это не редкость. Я вижу некоторые подобные вопросы, но ничего, что, кажется, не описывает мою проблему.

У меня есть два объекта: автомобиль и человек. Они во многих отношениях, то есть автомобиль может принадлежать нескольким людям, и человек может владеть несколькими автомобилями. Car имеет лениво инициализированный набор Drivers:

@ManyToMany(targetEntity=Person.class, fetch=FetchType.LAZY)
private Set<Person> people;

Я хочу найти все синие автомобили с владельцами в возрасте до 25 лет:

Criteria foo = persistenceManager.createCriteria(Car.class, "myCarAlias");
Criteria bar = foo.createCriteria("drivers", "myDriverAlias");
//add restrictions on foo and bar for blue and age, respectively
baz = foo.list();

Моя проблема заключается в том, когда я повторяю список и звоню getDrivers() На каждой машине он инициализирует коллекцию и получает все водители этой машины. Я думаю .list() Я бегал не устанавливает результаты на каждой машине.

Я вернув результаты, которые я ожидаю, если я вручную запускаю SQL Hibernate, создается, поэтому я разумно уверен, что критерии не проблема.

Я могу понять, почему это произойдет, но я не уверен, как обойти его без итерации над каждой машиной и запустить запрос для водителей на каждом. Я хотел бы избежать этого, если это возможно, и будет признателен за любой совет.

Заранее спасибо!

Это было полезно?

Решение

Если бы вы надеялись, что коллекция драйверов для каждой машины будет содержать только людей, которые соответствовали вашим критериям (т. Е. Более 25)? Другими словами, вы не хотите, чтобы водительская коллекция, содержащая людей, которые более 25?

Если это так, то вам нужно будет использовать результатрансформатор (см. Раздел 15.4. документации с гибернацией), потому что Hibernate не предварительно фильтрует коллекции, прежде чем возвращать результаты.

Однако, если проблема в том, что коллекция драйверов ленива загружена и не желательна, а затем настроить режим извлечения (я обычно использую присоединение, поскольку IIRC FetchMode.eaGer был устарел) должен решить проблему:

baz = persistenceManager.createCriteria(Car.class, "myCarAlias")
    .setFetchMode("drivers", FetchMode.JOIN)
    // add additional restrictions here
    .list();

Другие советы

Раздел 15.5 из гибернации документации. По сути, вы можете установить стратегию Fetch для ваших критериев запросов, которые должны иметь приоритет над основной стратегией Fetch, которые вы определены для отношений.

Пример из документации

List cats = sess.createCriteria(Cat.class)
   .add( Restrictions.like("name", "Fritz%") )
   .setFetchMode("mate", FetchMode.EAGER)
   .setFetchMode("kittens", FetchMode.EAGER)
   .list();

и документацияhttp://docs.jboss.org/hibernate/core/3.3/reference/en/html/querycriteria.html.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top