-
Ý nghĩa của
select d from TKBData d JOIN d.columns c WHERE c.name = column1là- 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ànamelàcolumn1 - Sau khi quyết định TKBData nào có ít nhất một
columnđối tượng mànamelàcolumn1, 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 - Ví dụ:bạn có
TKBDATA_1vớicolumn1vàcolumn2được liên kết, bạn cũng cóTKBDATA_2vớicolumn3liên kết. - Khi bạn chạy truy vấn của mình, nó sẽ bỏ qua
TKBDATA_2và quyết định trả lạiTKBDATA_1vì nó có ít nhất mộtcolumnđối tượng cóname=column2. Nhưng sau đó bạn không có quyền kiểm soátcolumnnào được liên kết đối tượng trả về choTKBDATA_1và JPA sẽ trả về tất cả các đối tượng cột được liên kết - 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 checkingvàrepeatable read
- Tìm một đối tượng TKBData nơi nó có một cột
-
Cập nhật
@OneToManycủ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 đó.