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.