Anda hanya dapat menggunakan EntityGraph
jika atribut asosiasi adalah bagian dari superclass dan dengan itu juga bagian dari semua subclass. Jika tidak, EntityGraph
akan selalu gagal dengan Exception
yang Anda dapatkan saat ini.
Cara terbaik untuk menghindari masalah pemilihan N+1 Anda adalah dengan membagi kueri Anda menjadi 2 kueri:
Kueri pertama mengambil MCValue
entitas menggunakan EntityGraph
untuk mengambil asosiasi yang dipetakan oleh selected
atribut. Setelah kueri itu, entitas ini kemudian disimpan dalam cache level 1 Hibernate/konteks persistensi. Hibernate akan menggunakannya saat memproses hasil kueri ke-2.
@Query("SELECT m FROM MCValue m") // add WHERE clause as needed ...
@EntityGraph(attributePaths = {"selected"})
public List<MCValue> findAll();
Kueri ke-2 kemudian mengambil Answer
entitas dan menggunakan EntityGraph
untuk juga mengambil Value
. terkait entitas. Untuk setiap Value
entitas, Hibernate akan membuat instance subkelas tertentu dan memeriksa apakah cache level 1 sudah berisi objek untuk kelas itu dan kombinasi kunci utama. Jika demikian, Hibernate menggunakan objek dari cache level 1, bukan data yang dikembalikan oleh kueri.
@Query("SELECT a FROM Answer a")
@EntityGraph(attributePaths = {"value"})
public List<Answer> findAll();
Karena kami telah mengambil semua MCValue
entitas dengan selected
yang terkait entitas, kita sekarang mendapatkan Answer
entitas dengan value
. yang diinisialisasi asosiasi. Dan jika asosiasi berisi MCValue
entitas, selected
asosiasi juga akan diinisialisasi.