En utilisant l'implémentation JPA de Hibernate, j'ai remarqué un comportement d'optimisation intéressant. Dans la même transaction, la clause WHERE de la requête JPA initiale est utilisée pour les requêtes suivantes impliquant les résultats de la requête initiale.Hibernate utilise la clause WHERE initiale dans les requêtes suivantes
Par exemple, personne a lastName et un ensemble de livres possédés.
// (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) se traduit par le SQL:
SELECT ... FROM Person WHERE lastName = 'Smith'
Lorsque (2) est exécuté et les accès aux livres de la personne, il génère le SQL:
SELECT ... FROM Person_Book book0_ WHERE book0_.personId IN (SELECT ... FROM ... WHERE lastName = 'Smith')
D'une certaine manière la clause WHERE de (1) est mémorisé et utilisé dans des requêtes ultérieures (2) impliquant la personne extraite. Comment appelle-t-on ce comportement dans Hibernate et comment puis-je le configurer?
Suivi: J'utilise la sous-sélection dans les livres de la personne. Ceci explique le comportement que je vois.