THAM GIA
Khi sử dụng JOIN
để chống lại một hiệp hội thực thể, JPA sẽ tạo THAM GIA giữa thực thể mẹ và các bảng thực thể con trong câu lệnh SQL được tạo.
Vì vậy, lấy ví dụ của bạn, khi thực hiện truy vấn JPQL này:
FROM Employee emp
JOIN emp.department dep
Hibernate sẽ tạo ra câu lệnh SQL sau:
SELECT emp.*
FROM employee emp
JOIN department dep ON emp.department_id = dep.id
Lưu ý rằng SELECT
mệnh đề SQL chỉ chứa các employee
cột trong bảng chứ không chứa các cột department
. Để lấy các department
cột của bảng, chúng ta cần sử dụng JOIN FETCH
thay vì JOIN
.
THAM GIA
Vì vậy, so với JOIN
, JOIN FETCH
cho phép bạn chiếu các cột của bảng tham gia trong SELECT
mệnh đề của câu lệnh SQL được tạo.
Vì vậy, trong ví dụ của bạn, khi thực hiện truy vấn JPQL này:
FROM Employee emp
JOIN FETCH emp.department dep
Hibernate sẽ tạo ra câu lệnh SQL sau:
SELECT emp.*, dept.*
FROM employee emp
JOIN department dep ON emp.department_id = dep.id
Lưu ý rằng, lần này, các department
cột trong bảng cũng được chọn, không chỉ các cột được liên kết với thực thể được liệt kê trong FROM
mệnh đề JPQL.
Ngoài ra, JOIN FETCH
là một cách tuyệt vời để giải quyết LazyInitializationException
khi sử dụng Hibernate vì bạn có thể khởi tạo các liên kết thực thể bằng FetchType.LAZY
chiến lược tìm nạp cùng với thực thể chính mà bạn đang tìm nạp.