Étant donné le modèle de domaine suivant, je veux charger tous les Answer
s, y compris leurs Value
s et leurs sous-enfants respectifs, et les mettre dans un AnswerDTO
pour 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 @EntityGraph
sur la Repository
méthode, je peux m'assurer que les valeurs sont pré-récupérées pour empêcher N + 1 sur l' Answer->Value
association. Bien que mon résultat soit satisfaisant, il existe un autre problème N + 1, en raison du chargement paresseux de l' selected
association de l' MCValue
al.
Utiliser ceci
@EntityGraph(attributePaths = {"value.selected"})
échoue, car le selected
champ n'est bien sûr qu'une partie de certaines des Value
entité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' selected
association uniquement si la valeur est a MCValue
? J'ai besoin de quelque chose comme ça optionalAttributePaths
.
selected
les 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.