2010-04-07 4 views
6

J'ai du mal à comprendre comment éviter la sélection n + 1 en jpa ou en hibernation.Comment puis-je résoudre le problème de sélection N + 1?

D'après ce que je lis, il y a la « gauche join fetch », mais je ne sais pas si cela fonctionne toujours avec plus d'une liste (OneToMany) ..

Quelqu'un pourrait-il me l'expliquer ou donner moi un lien avec une explication complète claire s'il vous plaît?

Je suis désolé si c'est une question noob, mais je ne peux pas trouver un article ou un document clair sur ce problème.

Merci

+0

La compréhension de ce problème est essentielle pour travailler avec Hibernate. J'ai même développé une petite librry pour identifier ce problème dans les tests unitaires: https://github.com/bedrin/jdbc-sniffer/ – bedrin

Répondre

6

En dehors de la jointure, vous pouvez également utiliser subselect (s). Il en résulte que 2 requêtes sont en cours d'exécution (ou en général m + 1, si vous avez des listes m), mais elle s'adapte bien à un grand nombre de listes, contrairement à la recherche de jointure. Avec la récupération de jointures, si vous récupérez deux tables (ou listes) avec votre entité, vous obtenez un produit cartésien , c'est-à-dire toutes les combinaisons de paires de lignes des deux tables. Si les tables sont grandes, le résultat peut être énorme, par ex. si les deux tables ont 1000 lignes, le produit cartésien contient 1 million de lignes!

Une meilleure alternative pour de tels cas est d'utiliser des sous-sélections. Dans ce cas, vous devez émettre 2 sélections - une pour chaque table - en plus de la sélection principale (qui charge l'entité parente), donc au total, vous chargez 1 + 100 + 100 lignes avec 3 requêtes. Pour l'enregistrement, la même chose avec chargement paresseux entraînerait 201 sélections distinctes, chacune chargeant une seule ligne.

Mise à jour: voici quelques exemples:

+2

pourriez-vous fournir un court exemple de hql pour la solution de sous-sélection? ça m'aiderait à le comprendre je pense. Merci :) –

+0

@Maxime J'ai ajouté quelques liens, espérons que ces aide :-) –

+0

cool merci, je peux travailler avec ça :) –

Questions connexes