Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

sự cố với OneToMany bao gồm một mệnh đề bộ lọc trong Spring jpa

  • Ý nghĩa của select d from TKBData d JOIN d.columns c WHERE c.name = column1

    1. Tìm một đối tượng TKBData nơi nó có một cột column được liên kết đối tượng mà namecolumn1
    2. Sau khi quyết định TKBData nào có ít nhất một column đối tượng mà namecolumn1 , sau đó nó sẽ trả về tất cả column được liên kết với nó đối tượng mà bạn không có quyền kiểm soát trong JPA. (xem Câu trả lời của tôi cho một câu hỏi khác ). Cách khác là viết sql gốc và trả về các đối tượng không phải thực thể tùy chỉnh
    3. Ví dụ:bạn có TKBDATA_1 với column1column2 được liên kết, bạn cũng có TKBDATA_2 với column3 liên kết.
    4. Khi bạn chạy truy vấn của mình, nó sẽ bỏ qua TKBDATA_2 và quyết định trả lại TKBDATA_1 vì nó có ít nhất một column đối tượng có name =column2 . Nhưng sau đó bạn không có quyền kiểm soát column nào được liên kết đối tượng trả về cho TKBDATA_1 và JPA sẽ trả về tất cả các đối tượng cột được liên kết
    5. Nếu bạn không chắc chắn về lý do, hãy đọc về phiên ngủ đông. Nó là nền tảng cho dirty checkingrepeatable read
  • Cập nhật @OneToMany của bạn như sau

   @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();
  • Khi nói đến ngôn ngữ truy vấn JPA, tôi muốn nghĩ về truy vấn một tập hợp các đối tượng trong bộ nhớ.

  • Vì vậy, bây giờ hãy cố gắng mô tả ý nghĩa của hai truy vấn sau về đối tượng.

   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
  • Đừng quên không giống như trong sql, nơi bạn chọn bất kỳ cột nào ở đây mà bạn đã nói rằng bạn muốn chọn các đối tượng TKBData và hạn chế trả về các đối tượng TKBData nào.

  • Vì vậy, để đạt được kết quả tương tự như sql gốc của bạn, hãy sử dụng truy vấn JPA thứ hai

Lưu ý:

Mặc dù bạn đã sử dụng một phép nối bên trái trong truy vấn sql của mình, nhưng nó thực sự là một truy vấn sql nối kết bên trong bởi vì bạn cũng đã áp dụng một where điều kiện đến bảng bên phải nhất trên phép nối đó.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. php - chuyển đổi từ định dạng json này sang định dạng json khác

  2. Thay đổi dữ liệu của một ô trong mysql

  3. Trong MySQL tại sao IF này trả về false?

  4. Tôi nên sử dụng loại công cụ nào (InnoDB hoặc MyISAM) cho cơ sở dữ liệu của mình cho một trang web?

  5. Làm thế nào để GỌI MỘT THỦ TỤC trong MySQL?