Tôi không nghĩ rằng mình sẽ hiểu đầy đủ về các lần tìm nạp.Làm cách nào để thực hiện tìm nạp "sâu" trong JPQL?
Tôi có truy vấn nơi tôi đang cố gắng háo hức "thổi phồng" tham chiếu xuống hai cấp.
Đó là, tôi A
có một tùy chọn Collection
của B
s, và mỗi B
có 0 hoặc 1 C
. Kích thước của bộ sưu tập B
được biết là nhỏ (10-20 ngọn). Tôi muốn tìm nạp trước biểu đồ này.
A
quan hệ B
được đánh dấu là FetchType.LAZY
và là tùy chọn. Mối quan hệ của B
với C
cũng là tùy chọn và FetchType.LAZY
.
Tôi đã hy vọng tôi có thể làm:
SELECT a
FROM A a
LEFT JOIN FETCH a.bs // look, no alias; JPQL forbids it
LEFT JOIN a.bs b // "repeated" join necessary since you can't alias fetch joins
LEFT JOIN FETCH b.c // this doesn't seem to do anything
WHERE a.id = :id
Khi tôi chạy này, tôi thấy rằng A
s B
bộ sưu tập thực sự lấy (tôi nhìn thấy một LEFT JOIN
trong SQL tham khảo bảng để mà B
được ánh xạ) .
Tuy nhiên, tôi không thấy bằng chứng nào cho thấy bảng của C
được tìm nạp.
Làm cách nào tôi có thể tìm nạp trước tất cả C
s và tất cả B
s và tất cả C
s có thể truy cập được từ một số A
nhất định? Tôi không thể nhìn thấy bất kỳ cách nào để làm điều này.
JPA gì làm bạn sử dụng không? Có những gợi ý có sẵn trong EclipseLink chính xác cho loại chức năng này. Xem các gợi ý 'eclipselink.join-fetch' và' eclipselink.batch' ... – Cascader
Cảm ơn bạn. Nếu tôi sử dụng 'eclipselink.join-fetch', có vẻ như tôi chỉ được phép đặt một thuộc tính. Đúng không? Ví dụ, nếu tôi thổi vốn 'join-fetch' của mình vào' a.bs.c', thì nếu tôi cũng muốn tham gia tìm nạp — hãy nói — 'a.bs.d' tôi sẽ không may mắn. Đúng? –
Ồ, điều này thật thú vị. Tài liệu EclipseLink (http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Query_Hints#Join_Fetch) không nói rằng các phím gợi ý truy vấn trùng lặp là có thể nhưng có lẽ chúng là? Xem liên kết thú vị này: https://github.com/mysema/querydsl/issues/348 –