Учитывая следующую модель предметной области, я хочу загрузить все Answer
s, включая их 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
ассоциации MCValue
s.
Используя это
@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 для этого. Можете ли вы уточнить, насколько безопасно (с точки зрения согласованности) полагаться на кэш для хранения результатов? Это работает, когда запросы сделаны в транзакции? Я боюсь трудно заметить и случайные ленивые ошибки инициализации.