-
Ý nghĩa của
select d from TKBData d JOIN d.columns c WHERE c.name = column1
là- 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àname
làcolumn1
- Sau khi quyết định TKBData nào có ít nhất một
column
đối tượng màname
là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_1
vớicolumn1
vàcolumn2
được liên kết, bạn cũng cóTKBDATA_2
vớicolumn3
liên kết. - Khi bạn chạy truy vấn của mình, nó sẽ bỏ qua
TKBDATA_2
và quyết định trả lạiTKBDATA_1
vì 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átcolumn
nào được liên kết đối tượng trả về choTKBDATA_1
và 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 checking
vàrepeatable read
- Tìm một đối tượng TKBData nơi nó có một cột
-
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 đó.