2013-06-14 33 views
10

Hai bảng cơ sở dữ liệu có mối quan hệ khóa ngoài.Tham gia các thực thể không liên quan với tiêu chí jpa api

Họ được ánh xạ tới hai thực thể MộtB bởi JPA, nhưng tham gia các cột được bằng tay loại bỏ khỏi thực thể, vì vậy trong lớp học thế giới JPA MộtB không liên quan và bạn không thể điều hướng từ một đến khác thông qua một lĩnh vực/tài sản.

Sử dụng tiêu chí api là có thể tạo truy vấn tham gia hai bảng không?

Tất cả các ví dụ tôi tìm thấy trên internet sử dụng các cột tham gia để đạt được mục tiêu, nhưng, như đã nói ở trên, nó đã bị xóa khỏi các mã bởi vì hầu hết thời gian tôi không quan tâm đến mối quan hệ giữa MộtB và tôi sợ về chi phí có thể.

Trả lời

14

Đầu tiên: Mối quan hệ khóa ngoại không chỉ để điều hướng. Họ chủ yếu phục vụ để đảm bảo rằng không có giá trị giả được giới thiệu trong mối quan hệ. Họ cũng có thể giúp cơ sở dữ liệu để tối ưu hóa truy vấn. Tôi sẽ khuyên bạn nên xem xét lại điều đó.

Dù sao, để tạo một truy vấn có sử dụng một số cơ quan liên quan, bạn cần phải đặt chúng như from (root) tổ chức (như bạn sẽ làm gì trong SQL hoặc JPQL)

SELECT .... FROM Link l, Training t WHERE l.attribute = t.attribute; 

Root<Link> rootLink = criteriaQuery.from(Link.class); 
Root<Training> rootTraining = criteriaQuery.from(Training.class); 
... 
criteriaQuery.where(
    criteriaBuilder.equal(rootLink.get(link_.linkAttribute), trainingLink)); 
+0

Cần lưu ý rằng sử dụng nhiều rễ tạo ra một sản phẩm Descartes (ví dụ: một 'CHÉO JOIN') giữa các thực thể. Với điều kiện 'WHERE', điều này hoạt động giống như' INNER JOIN' (bao gồm hiệu năng giống như được ghi chú [ở đây] (https://stackoverflow.com/questions/670980#671023)). –

Các vấn đề liên quan