Учитывая следующую модель предметной области, я хочу загрузить все Answers, включая их Valueи соответствующие дочерние элементы, и поместить их в, 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ассоциацию, если значение равно MCValue? Мне нужно что - то вроде optionalAttributePaths.

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