In Anbetracht des folgenden Domänenmodells möchte ich alle Answer
s einschließlich ihrer Value
s und ihrer jeweiligen Unterkinder laden und in eine AnswerDTO
ablegen, 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 @EntityGraph
für die Repository
Methode kann ich sicherstellen, dass die Werte vorab abgerufen werden, um N + 1 für die Answer->Value
Zuordnung zu verhindern . Während mein Ergebnis in Ordnung ist, gibt es ein weiteres N + 1-Problem, da die selected
Assoziation der MCValue
s verzögert geladen wird .
Verwenden Sie dies
@EntityGraph(attributePaths = {"value.selected"})
schlägt fehl, weil das selected
Feld natürlich nur ein Teil einiger Value
Entitä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 selected
Zuordnung abzurufen, wenn der Wert a ist MCValue
? Ich brauche so etwas optionalAttributePaths
.
selected
von 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.