In Anbetracht des folgenden Domänenmodells möchte ich alle Answers einschließlich ihrer Values und ihrer jeweiligen Unterkinder laden und in eine AnswerDTOablegen, um sie dann in JSON zu konvertieren. Ich habe eine funktionierende Lösung, aber sie leidet unter dem N + 1-Problem, das ich mithilfe eines Ad-hoc-Problems beseitigen möchte @EntityGraph. Alle Zuordnungen sind konfiguriert LAZY.
@Query("SELECT a FROM Answer a")
@EntityGraph(attributePaths = {"value"})
public List<Answer> findAll();
Mit einem Ad-hoc- Verfahren @EntityGraphfür die RepositoryMethode kann ich sicherstellen, dass die Werte vorab abgerufen werden, um N + 1 für die Answer->ValueZuordnung zu verhindern . Während mein Ergebnis in Ordnung ist, gibt es ein weiteres N + 1-Problem, da die selectedAssoziation der MCValues verzögert geladen wird .
Verwenden Sie dies
@EntityGraph(attributePaths = {"value.selected"})
schlägt fehl, weil das selectedFeld natürlich nur ein Teil einiger ValueEntitäten ist:
Unable to locate Attribute with the the given name [selected] on this ManagedType [x.model.Value];
Wie kann ich JPA mitteilen, dass nur dann versucht wird, die selectedZuordnung abzurufen, wenn der Wert a ist MCValue? Ich brauche so etwas optionalAttributePaths.

selectedvon Antworten mit aMCValue. Ich mochte es nicht, dass dies eine zusätzliche Schleife erfordern würde und ich die Zuordnung zwischen den Datensätzen verwalten müsste. Ich mag Ihre Idee, den Hibernate-Cache dafür auszunutzen. Können Sie erläutern, wie sicher (in Bezug auf die Konsistenz) es ist, sich auf den Cache zu verlassen, um die Ergebnisse zu enthalten? Funktioniert dies, wenn die Abfragen in einer Transaktion durchgeführt werden? Ich habe Angst vor schwer zu erkennenden und sporadisch faulen Initialisierungsfehlern.