Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

masalah dengan OneToMany termasuk klausa filter di musim semi jpa

  • Arti dari select d from TKBData d JOIN d.columns c WHERE c.name = column1 adalah

    1. Temukan objek TKBData yang memiliki column yang terkait objek yang name adalah column1
    2. Setelah diputuskan TKBData mana yang memiliki setidaknya satu column objek yang name adalah column1 , maka ia akan mengembalikan semua column 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
    3. Misalnya, Anda memiliki TKBDATA_1 dengan column1 dan column2 terkait, Anda juga memiliki TKBDATA_2 dengan column3 terkait.
    4. Saat Anda menjalankan kueri, itu akan mengabaikan TKBDATA_2 dan memutuskan untuk mengembalikan TKBDATA_1 karena memiliki setidaknya satu column objek dengan name =column2 . Tapi setelah itu Anda tidak memiliki kendali atas column yang terkait objek yang akan dikembalikan untuk TKBDATA_1 dan JPA akan mengembalikan semua objek kolom terkait
    5. 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 dan repeatable read
  • 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tidak dapat membuat tabel di meja kerja MySQL 5.2.40

  2. Bagaimana menerapkan pagination data php-mysql menggunakan penyedia data

  3. Bagaimana cara menyegarkan dropdown tanpa penyegaran halaman?

  4. Bagaimana cara memotong tabel yang dibatasi kunci asing?

  5. Bagaimana cara menambahkan aturan validator bidang unik gabungan di Laravel 4