Hibernate использует начальное предложение WHERE в последующих запросах - PullRequest
1 голос
/ 31 марта 2009

При использовании реализации JPA в Hibernate я заметил интересное поведение при оптимизации. В рамках той же транзакции предложение WHERE исходного запроса JPA используется для последующих запросов, связанных с результатами исходного запроса.

Например, у человека есть фамилия и набор принадлежащих ему книг.

// (1) get person by last name
Query q = entityManager.createQuery("SELECT p FROM Person p WHERE p.firstName = :lastName");
q.setParameter("lastName", "Smith");
List<Person> persons = q.getResultList();

// (2) get books owned by some arbitrary person in persons
Person person = persons.get(n);
Collection<Book> books = person.books;

(1) переводится в SQL:

SELECT ... FROM Person WHERE lastName = 'Smith'

Когда (2) запускается и получает доступ к личным книгам, он генерирует SQL:

SELECT ... FROM Person_Book book0_ WHERE book0_.personId IN (SELECT ... FROM ... WHERE lastName = 'Smith')

Каким-то образом предложение WHERE из (1) запоминается и используется в последующих запросах (2) с участием найденного лица. Как называется это поведение в Hibernate и как я могу его настроить?

Продолжение : я использую отбор на книгах человека. Это объясняет поведение, которое я вижу.

1 Ответ

1 голос
/ 31 марта 2009

Извлечено из этой ссылки :

Последняя форма выборки, которую я хочу охватить, - выборочная выборка. Выборочная выборка очень похожа на выборочную выборку, управляемую размером, которую я только что описал, но исключает «числовые сложности» из уравнения. Извлечение выборки - фактически другой тип стратегии извлечения, которая применяется к ассоциациям стиля коллекции. Однако, в отличие от выборки в стиле объединения, выборочная выборка по-прежнему совместима с ленивыми ассоциациями. Разница в том, что при выборочной выборке получается только «весь матч», как сказал бы мой сотрудник, а не просто партия. Другими словами, он использует выполнение подвыбора для передачи набора идентификаторов основного объекта в выборку таблицы ассоциации:

выбрать * от владельца

выберите * из питомца, где владелец_id (выберите идентификатор от владельца)

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