Фильтр Lazily Initialized Hibernate Коллекция - PullRequest
1 голос
/ 04 октября 2010

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

У меня есть два объекта: машина и человек.Они находятся во взаимоотношениях «многие ко многим», то есть автомобиль может принадлежать нескольким людям, а человек может иметь несколько автомобилей.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 в спящем режиме, поэтому я вполне уверен, что критерииЭто не проблема.

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

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

Ответы [ 2 ]

3 голосов
/ 05 октября 2010

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

Если это так, вам нужно использовать ResultTransformer (см. раздел 15.4 Документация Hibernate), поскольку Hibernate не выполняет предварительную фильтрацию коллекций перед возвратом результатов.

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

baz = persistenceManager.createCriteria(Car.class, "myCarAlias")
    .setFetchMode("drivers", FetchMode.JOIN)
    // add additional restrictions here
    .list();
1 голос
/ 04 октября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...