Каков стандартный способ избежать проблем с N+1 и декартовым произведением при выборке коллекций с помощью JPA?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Каков стандартный способ избежать проблем с N+1 и декартовым произведением при выборке коллекций с помощью JPA?

Сообщение Anonymous »

Когда у вас есть сущность, поля которой являются коллекциями, желательно получить данные с наименьшим возможным количеством запросов и использовать как можно меньше памяти.
Первая проблема решается с помощью «объединенной выборки» в запросах JPQL (решение проблемы N+1).

Однако «объединенная выборка» (что легко увидеть при проверке соответствующего SQL-запроса) вызывает проблему декартова произведения: каждая «строка», соответствующая полям сущности без кратности, присутствует в возвращаемом наборе результатов с кратностью N_1 x N_2 x ... x N_m, где N_1 — кратность первой коллекции, N_2 — кратность второй, а N_m — кратность m-я коллекция, предполагая, что сущность имеет m полей, которые являются коллекциями.

Hibernate решает эту проблему с помощью FetchMode.SUBSELECT (который, если я не ошибаюсь, делает m+1 запросов, каждый из которых не возвращает избыточных данных). Каков стандартный
способ решения этой проблемы в JPA (мне кажется, что я не могу смешивать, по крайней мере, в этом случае, аннотации JPA с аннотациями Hibernate)?

Подробнее здесь: https://stackoverflow.com/questions/258 ... ssues-whil
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»