При использовании реализации 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 и как я могу его настроить?
Продолжение : я использую отбор на книгах человека. Это объясняет поведение, которое я вижу.