-
Arti dari
select d from TKBData d JOIN d.columns c WHERE c.name = column1adalah- Temukan objek TKBData yang memiliki
columnyang terkait objek yangnameadalahcolumn1 - Setelah diputuskan TKBData mana yang memiliki setidaknya satu
columnobjek yangnameadalahcolumn1, maka ia akan mengembalikan semuacolumnyang 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_1dengancolumn1dancolumn2terkait, Anda juga memilikiTKBDATA_2dengancolumn3terkait. - Saat Anda menjalankan kueri, itu akan mengabaikan
TKBDATA_2dan memutuskan untuk mengembalikanTKBDATA_1karena memiliki setidaknya satucolumnobjek denganname=column2. Tapi setelah itu Anda tidak memiliki kendali atascolumnyang terkait objek yang akan dikembalikan untukTKBDATA_1dan 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 checkingdanrepeatable 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.