Maison > Java > javaDidacticiel > le corps du texte

Comment pouvez-vous résoudre le problème de requête N 1 dans JPA et Hibernate ?

Susan Sarandon
Libérer: 2024-11-17 07:40:03
original
120 Les gens l'ont consulté

How Can You Address the N 1 Query Issue in JPA and Hibernate?

Résoudre le problème N 1 dans JPA et Hibernate

Dans JPA et Hibernate, un problème de requête N 1 survient lorsque plusieurs requêtes sont exécutées pour récupérer les données associées, ce qui entraîne une récupération de données inefficace. Pour résoudre ce problème, Hibernate propose une gamme de techniques.

Comprendre le problème N 1

Le problème se produit lorsqu'une requête initiale récupère des entités principales et que les requêtes suivantes sont déclenchées pour récupérer les données associées. Par exemple, récupérer les entités PostComment sans précharger l'entité Post associée forcera Hibernate à exécuter des requêtes supplémentaires pour chaque instance Post consultée.

Solution dans Hibernate

1. Récupération de jointure :

En utilisant la stratégie « rejoindre la récupération », les données associées peuvent être récupérées aux côtés des entités principales en une seule requête. Dans notre exemple, nous pouvons utiliser :

List<PostComment> comments = entityManager.createQuery("select pc from PostComment pc join fetch pc.post where pc.review = :review", PostComment.class)
    .setParameter("review", review)
    .getResultList();
Copier après la connexion

2. Prélecture de collection :

Lors de la récupération d'une collection d'entités principales et d'une collection supplémentaire de données associées, il est conseillé de préextraire ces dernières. Une option consiste à pré-extraire la collection dans la requête initiale :

List<PostComment> comments = entityManager.createQuery("select pc from PostComment pc join fetch pc.post where pc.review = :review", PostComment.class)
    .setParameter("review", review)
    .getResultList();

List postTags = entityManager.createQuery("select pt from PostTag pt where pt.post in (:commentPosts)", PostTag.class)
    .setParameter("commentPosts", comments)
    .getResultList();
Copier après la connexion

3. Requête secondaire :

Dans les cas où la prélecture n'est pas efficace ou où plusieurs associations d'enfants doivent être récupérées, une stratégie de requête secondaire peut être utilisée. Récupérez les entités principales avec une requête de base et utilisez une requête ultérieure pour récupérer les données associées.

Détection automatique avec db-util

La bibliothèque db-util fournit un des moyens automatisés pour détecter le problème de requête N 1. Les assertions JUnit peuvent être utilisées pour valider le nombre attendu d'instructions SQL générées, détectant ainsi le problème dès le début du processus de développement.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal