Étant donné le modèle de domaine suivant, je veux charger tous les Answers, y compris leurs Values et leurs sous-enfants respectifs, et les mettre dans un AnswerDTOpour ensuite les convertir en JSON. J'ai une solution de travail mais elle souffre du problème N + 1 dont je veux me débarrasser en utilisant un ad-hoc @EntityGraph. Toutes les associations sont configurées LAZY.
@Query("SELECT a FROM Answer a")
@EntityGraph(attributePaths = {"value"})
public List<Answer> findAll();
En utilisant un ad-hoc @EntityGraphsur la Repositoryméthode, je peux m'assurer que les valeurs sont pré-récupérées pour empêcher N + 1 sur l' Answer->Valueassociation. Bien que mon résultat soit satisfaisant, il existe un autre problème N + 1, en raison du chargement paresseux de l' selectedassociation de l' MCValueal.
Utiliser ceci
@EntityGraph(attributePaths = {"value.selected"})
échoue, car le selectedchamp n'est bien sûr qu'une partie de certaines des Valueentités:
Unable to locate Attribute with the the given name [selected] on this ManagedType [x.model.Value];
Comment puis-je dire à JPA d'essayer de récupérer l' selectedassociation uniquement si la valeur est a MCValue? J'ai besoin de quelque chose comme ça optionalAttributePaths.

selectedles réponses qui ont unMCValue. Je n'aimais pas que cela nécessiterait une boucle supplémentaire et je devrais gérer la correspondance entre les ensembles de données. J'aime votre idée d'exploiter le cache Hibernate pour cela. Pouvez-vous expliquer dans quelle mesure (en termes de cohérence) il est sûr de s'appuyer sur le cache pour contenir les résultats? Est-ce que cela fonctionne lorsque les requêtes sont effectuées dans une transaction? J'ai peur des erreurs d'initialisation paresseuses difficiles à repérer et sporadiques.