Dengan model domain berikut, saya ingin memuat semua Answer
s termasuk Value
s dan sub-anak mereka masing-masing dan memasukkannya AnswerDTO
ke 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 @EntityGraph
pada Repository
metode ini saya dapat memastikan bahwa nilai-nilai sudah diambil sebelumnya untuk mencegah N + 1 pada Answer->Value
asosiasi. Sementara hasil saya baik-baik saja ada masalah N +1, karena malas memuat selected
asosiasi dari MCValue
s.
Menggunakan ini
@EntityGraph(attributePaths = {"value.selected"})
gagal, karena selected
bidang ini tentu saja hanya sebagian dari beberapa Value
entitas:
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 selected
asosiasi jika nilainya adalah a MCValue
? Saya butuh sesuatu seperti optionalAttributePaths
.
selected
jawaban 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.