-
Arti dari
select d from TKBData d JOIN d.columns c WHERE c.name = column1
adalah- Temukan objek TKBData yang memiliki
column
yang terkait objek yangname
adalahcolumn1
- Setelah diputuskan TKBData mana yang memiliki setidaknya satu
column
objek yangname
adalahcolumn1
, maka ia akan mengembalikan semuacolumn
yang terkait objek yang tidak Anda kendalikan di JPA. ( lihat Jawaban saya untuk pertanyaan lain ). Alternatifnya adalah menulis sql asli dan mengembalikan objek non-entitas khusus - Misalnya, Anda memiliki
TKBDATA_1
dengancolumn1
dancolumn2
terkait, Anda juga memilikiTKBDATA_2
dengancolumn3
terkait. - Saat Anda menjalankan kueri, itu akan mengabaikan
TKBDATA_2
dan memutuskan untuk mengembalikanTKBDATA_1
karena memiliki setidaknya satucolumn
objek denganname
=column2
. Tapi setelah itu Anda tidak memiliki kendali atascolumn
yang terkait objek yang akan dikembalikan untukTKBDATA_1
dan JPA akan mengembalikan semua objek kolom terkait - Jika Anda tidak yakin dengan alasannya, baca tentang sesi hibernasi. Bagaimana sesi ini memberikan presentasi unik dari setiap entri terkait di memori. Ini adalah dasar untuk
dirty checking
danrepeatable read
- Temukan objek TKBData yang memiliki
-
Perbarui
@OneToMany
. Anda sebagai berikut
@OneToMany(fetch = FetchType.EAGER,
cascade = CascadeType.ALL, orphanRemoval = true)
@Builder.Default
@JoinTable(name = "TKBDATA_TKBCOLUMN",
joinColumns = @JoinColumn(name = "TKBDATA_ID"),
inverseJoinColumns = @JoinColumn(name = "COLUMNS_ID"))
private Set<TKBColumn> columns = Sets.newHashSet();
-
Ketika berbicara tentang bahasa kueri JPA, saya ingin memikirkan tentang kueri kumpulan objek dalam memori.
-
Jadi sekarang coba gambarkan arti dari dua pertanyaan berikut dalam kaitannya dengan objek.
select d from TKBData d LEFT JOIN d.columns c WHERE c.name = :name
vs
select d from TKBData d JOIN d.columns c WHERE c.name = :name
-
Jangan lupa tidak seperti di sql di mana Anda memilih kolom apa pun di sini, Anda telah mengatakan ingin memilih objek TKBData dan membatasi objek TKBData mana yang akan dikembalikan.
-
Jadi untuk mencapai hasil yang sama dengan sql asli Anda, gunakan kueri JPA kedua
Catatan:
Meskipun Anda menggunakan gabungan kiri dalam kueri sql Anda, ini secara efektif merupakan kueri sql gabungan dalam karena Anda juga menerapkan where
kondisi ke tabel paling kanan pada gabungan itu.