Dato il seguente modello di dominio, voglio caricare tutti Answer
i messaggi inclusi Value
i loro figli secondari e inserirli in un file AnswerDTO
per poi convertirli in JSON. Ho una soluzione funzionante ma soffre del problema N + 1 di cui voglio liberarmi usando un ad-hoc @EntityGraph
. Tutte le associazioni sono configurate LAZY
.
@Query("SELECT a FROM Answer a")
@EntityGraph(attributePaths = {"value"})
public List<Answer> findAll();
Utilizzando un metodo ad-hoc @EntityGraph
sul Repository
metodo, posso garantire che i valori siano pre-recuperati per impedire N + 1 sull'associazione Answer->Value
. Mentre il mio risultato va bene c'è un altro problema N + 1, a causa del caricamento lento selected
dell'associazione della MCValue
s.
Usando questo
@EntityGraph(attributePaths = {"value.selected"})
fallisce, perché il selected
campo è ovviamente solo una parte di alcune Value
entità:
Unable to locate Attribute with the the given name [selected] on this ManagedType [x.model.Value];
Come posso dire a JPA provare a recuperare l' selected
associazione solo nel caso in cui il valore sia a MCValue
? Ho bisogno di qualcosa del genere optionalAttributePaths
.
selected
quelle risposte che hanno unMCValue
. Non mi è piaciuto che ciò richiederebbe un ciclo aggiuntivo e avrei bisogno di gestire il mapping tra i set di dati. Mi piace la tua idea di sfruttare la cache di Hibernate per questo. Puoi approfondire quanto è sicuro (in termini di coerenza) fare affidamento sulla cache per contenere i risultati? Funziona quando le query vengono fatte in una transazione? Ho paura di errori di inizializzazione pigri difficili da individuare e sporadici.