2009-03-30 8 views
1

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.

Répondre

1

Extrait de this link:

La dernière forme d'aller chercher je veux couvrir est fetching subselect. La récupération par sous-sélection est très similaire à la récupération contrôlée par lots, que je viens de décrire, mais élimine les «complications numériques» de l'équation. La récupération de sous-sélection est en fait un type de stratégie de récupération différent appliqué aux associations de style de collection. Cependant, contrairement à la recherche de style de jointure, la récupération de sous-sélection est toujours compatible avec les associations paresseuses. La différence est que la recherche de sous-sélection ne fait que «tout le tournage», comme le dirait un de mes collègues, plutôt qu'un simple lot. En d'autres termes, il utilise l'exécution subselect pour passer l'ensemble d'identification de l'entité principale mis dans la sélection hors de la table d'association:

select * from propriétaire

select * from animal où OWNER_ID en (sélectionner l'identifiant du propriétaire)

Questions connexes