З огляду на наступну модель домену, я хочу завантажити всі Answers, включаючи їх Values та їхніх піддітей та помістити його в, AnswerDTOа потім перетворити на JSON. У мене є робоче рішення, але воно страждає від проблеми N + 1, від якої я хочу позбутися за допомогою спеціальних дій @EntityGraph. Усі асоціації налаштовані LAZY.
@Query("SELECT a FROM Answer a")
@EntityGraph(attributePaths = {"value"})
public List<Answer> findAll();
Використання Однорангової @EntityGraphна Repositoryметоді , який я можу гарантувати , що значення попередньо натягнуті запобігти N + -на Answer->Valueасоціації. Хоча мій результат прекрасний, є ще одна проблема N + 1 через ледачу завантаження selectedасоціації MCValues.
Використовуючи це
@EntityGraph(attributePaths = {"value.selected"})
не вдається, оскільки це selectedполе, звичайно, лише частина деяких Valueсутностей:
Unable to locate Attribute with the the given name [selected] on this ManagedType [x.model.Value];
Як я можу сказати JPA лише спробувати отримати selectedасоціацію, якщо значення є a MCValue? Мені потрібно щось на кшталт optionalAttributePaths.

selectedвідповідей, які мають аMCValue. Мені не подобалось, що для цього потрібен додатковий цикл, і мені потрібно буде керувати відображенням між наборами даних. Мені подобається ваша ідея використовувати кеш-режим Hibernate для цього. Чи можете ви пояснити, наскільки безпечно (з точки зору послідовності) покладатися на кеш, щоб містити результати? Чи працює це, коли запити виконуються в транзакції? Я боюся важко помітити і спорадично помилятися в помилках ініціалізації.