Đưa ra mô hình miền sau, tôi muốn tải tất cả các Answers bao gồm cả con Valuevà các phần tử con tương ứng của chúng và đặt nó vào một AnswerDTOđể sau đó chuyển đổi thành JSON. Tôi có một giải pháp làm việc nhưng nó gặp phải vấn đề N + 1 mà tôi muốn loại bỏ bằng cách sử dụng quảng cáo @EntityGraph. Tất cả các hiệp hội được cấu hình LAZY.
@Query("SELECT a FROM Answer a")
@EntityGraph(attributePaths = {"value"})
public List<Answer> findAll();
Sử dụng một quảng cáo @EntityGraphtrên Repositoryphương pháp tôi có thể đảm bảo rằng các giá trị được tìm nạp trước để ngăn N + 1 trên Answer->Valueliên kết. Trong khi kết quả của tôi vẫn ổn, có một vấn đề N + 1 khác, vì lười tải selectedliên kết của MCValues.
Sử dụng cái này
@EntityGraph(attributePaths = {"value.selected"})
thất bại, vì selectedtrường tất nhiên chỉ là một phần của một số Valuethực thể:
Unable to locate Attribute with the the given name [selected] on this ManagedType [x.model.Value];
Làm thế nào tôi có thể nói với JPA chỉ thử tìm nạp selectedliên kết trong trường hợp giá trị là a MCValue? Tôi cần một cái gì đó như optionalAttributePaths.

selectedcho những câu trả lời có aMCValue. Tôi không thích rằng điều này sẽ yêu cầu một vòng lặp bổ sung và tôi sẽ cần quản lý ánh xạ giữa các bộ dữ liệu. Tôi thích ý tưởng của bạn để khai thác bộ đệm Hibernate cho việc này. Bạn có thể giải thích mức độ an toàn (về tính nhất quán) dựa vào bộ đệm để chứa kết quả không? Điều này có hoạt động khi các truy vấn được thực hiện trong một giao dịch? Tôi sợ khó phát hiện và lẻ tẻ lỗi khởi tạo lười biếng.