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 SELECTmệnh đề SQL chỉ chứa các employeecột trong bảng chứ không chứa các cột department. Để lấy các departmentcột của bảng, chúng ta cần sử dụng JOIN FETCHthay vì JOIN.
THAM GIA
Vì vậy, so với JOIN, JOIN FETCHcho phép bạn chiếu các cột của bảng tham gia trong SELECTmệ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 departmentcộ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 FROMmệnh đề JPQL.
Ngoài ra, JOIN FETCHlà một cách tuyệt vời để giải quyết LazyInitializationExceptionkhi 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.LAZYchiến lược tìm nạp cùng với thực thể chính mà bạn đang tìm nạp.