Đưa ra mô hình miền sau, tôi muốn tải tất cả các Answer
s bao gồm cả con Value
và 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 @EntityGraph
trên Repository
phươ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->Value
liê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 selected
liên kết của MCValue
s.
Sử dụng cái này
@EntityGraph(attributePaths = {"value.selected"})
thất bại, vì selected
trường tất nhiên chỉ là một phần của một số Value
thự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 selected
liên kết trong trường hợp giá trị là a MCValue
? Tôi cần một cái gì đó như optionalAttributePaths
.
selected
cho 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.