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:
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