Роман Нагаев
хмм, ну если очень хочется, то вот мои версии:
1) возможно он не может заджойнить потому что ты идёшь не стой стороны связи (есть ограничения, почитай про овнера связи)
2) возможно твоя реализация jpa не может такой фетч провернуть
3) возможно криво настроены связи, или криво сделан фетч, меня смущает ON
ещё стоит сказать что не факт что джойны будут эффективней чем N+1 потому что они порождают Cartesian Product Problem
и вообще хибер - не лучшее решение для отчётов и прочих отображений данных, он для крудов, скорее всего в этом случае ты получишь от использования хибера больше проблем чем пользы
1) связь везде двунаправленная.. но почитаю этом момент
3) без ON (т.е. через "JOIN FETCH a.client.visits") я вообще ловлю org.hibernate.loader.MultipleBagFetchException
+ SQL то генерится верный, если его взять и отправить нативно в БД, то всё выдаётся.
ещё стоит сказать что не факт что джойны будут эффективней чем N+1
ну это звучит странновато. например, нативный запрос выполняется 2-3 сек и возвращает 10к+ записей. если сгруппировать и агрегировать, то там 200 записей за 0,5 сек.
ещё особенность в том приложуха и БД у меня на разных машинах...
так вот с N+1
локально у меня выполняется сек 5, собирая коллекции визитов всего по тем же 200 клиентам, удовлетворяющим условию... т.е. ~200 доп запросов, а если их будет 5000?
а вот приложуха задеплоенная на
heroku вообще не дожидается ответа по таймауту, т.е. тупо не работает..
хибер - не лучшее решение для отчётов и прочих отображений данных, он для крудов
так а чем это не круд - получить сущности? просто там есть второй уровень вложенности...
отчёт это я уж для наглядности контекста приплёл... что с этими сущностями делать и как их обрабатывать - дело 10ое..
в любом случае спасибо за размышления...
возможно это следствие подкопотной работы хибера.. там же есть много "фичей", порождающих доп запросы...на эту тему есть доклад "Николай Алименков - Босиком по граблям Hibernate":
ww.youtube.com/watch?v=YzOTZTt-PR0&feature=youtu.be