Dengan model domain berikut, saya ingin memuat semua Answers termasuk Values dan sub-anak mereka masing-masing dan memasukkannya AnswerDTOke dalam kemudian dikonversi ke JSON. Saya memiliki solusi yang berfungsi tetapi mengalami masalah N +1 yang ingin saya singkirkan dengan menggunakan ad-hoc @EntityGraph. Semua asosiasi dikonfigurasikan LAZY.
@Query("SELECT a FROM Answer a")
@EntityGraph(attributePaths = {"value"})
public List<Answer> findAll();
Menggunakan ad-hoc @EntityGraphpada Repositorymetode ini saya dapat memastikan bahwa nilai-nilai sudah diambil sebelumnya untuk mencegah N + 1 pada Answer->Valueasosiasi. Sementara hasil saya baik-baik saja ada masalah N +1, karena malas memuat selectedasosiasi dari MCValues.
Menggunakan ini
@EntityGraph(attributePaths = {"value.selected"})
gagal, karena selectedbidang ini tentu saja hanya sebagian dari beberapa Valueentitas:
Unable to locate Attribute with the the given name [selected] on this ManagedType [x.model.Value];
Bagaimana saya bisa memberi tahu JPA hanya mencoba mengambil selectedasosiasi jika nilainya adalah a MCValue? Saya butuh sesuatu seperti optionalAttributePaths.

selectedjawaban yang memiliki aMCValue. Saya tidak suka bahwa ini akan memerlukan loop tambahan dan saya perlu mengelola pemetaan antara set data. Saya suka ide Anda untuk mengeksploitasi cache Hibernate untuk ini. Bisakah Anda menguraikan seberapa aman (dalam hal konsistensi) itu bergantung pada cache untuk mengandung hasil? Apakah ini berfungsi ketika kueri dibuat dalam transaksi? Saya takut sulit dikenali dan kesalahan inisialisasi malas sporadis.