Dato il seguente modello di dominio, voglio caricare tutti Answeri messaggi inclusi Valuei loro figli secondari e inserirli in un file AnswerDTOper 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 @EntityGraphsul Repositorymetodo, 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 selecteddell'associazione della MCValues.
Usando questo
@EntityGraph(attributePaths = {"value.selected"})
fallisce, perché il selectedcampo è ovviamente solo una parte di alcune Valueentità:
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' selectedassociazione solo nel caso in cui il valore sia a MCValue? Ho bisogno di qualcosa del genere optionalAttributePaths.

selectedquelle 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.