Как я могу решить проблему выбора N+1?

У меня проблемы с пониманием того, как избежать выбора n+1 в jpa или hibernate.

из того, что я читал, есть "левый Join fetch", но я не уверен, что он все еще работает с более чем одним списком (oneToMany)..

может кто-нибудь объяснить мне это или дать мне ссылку с четким полным объяснением, пожалуйста ?

извините, если это нуб вопрос, но я не могу найти четкую статью или доку по этому вопросу.

спасибо

1 ответов


помимо соединения, вы также можете использовать подселекты. Это приводит к выполнению 2 запросов (или вообще m + 1, Если у вас есть m списки), но он хорошо масштабируется для большого количества списков, в отличие от выборки соединения.

с помощью join fetching, если вы получаете 2 таблицы (или списки) с вашей сущностью, вы получаете декартова произведения, т. е. все комбинации пар строк из двух таблиц. Если таблицы большие, результат может быть огромный, например, если обе таблицы имеют 1000 строк, декартово произведение содержит 1 миллион строк!

лучший вариант для таких случаев-использовать подвыборки. В этом случае вы бы выдали 2 выбора - по одному для каждой таблицы-поверх основного выбора (который загружает родительский объект), поэтому вы загружаете 1 + 100 + 100 строки с 3 запросами.

для записи то же самое с ленивой загрузкой приведет к 201 отдельному выбору, каждая загрузка одного ряд.

обновление: вот несколько примеров: