Работа около IN
ограничението е неефективно и JPA не винаги е правилният инструмент за работата. Помислете за следното:
-
Хиляди обвързани стойности ще доведат до потенциално мегабайти SQL. Изпращането на този SQL към базата данни ще отнеме много време. Базата данни може да отнеме повече време, за да прочете SQL текста, отколкото да го изпълни според Отговорът на Том на въпрос "Ограничение и преобразуване много дълъг IN списък:WHERE x IN ( ,,, ...)" .
-
Това ще бъде неефективно поради SQL анализ. Не само, че отнема много време за анализиране на този дълъг SQL, но всяко извикване има различен брой обвързани параметри, които ще бъдат анализирани и планирани отделно (вижте тази статия, която го обяснява ).
-
Има строго ограничение на обвързаните параметри в SQL израз. Можете да повторите
OR
няколко пъти, за да заобиколитеIN
лимит, но в даден момент ще достигнете лимита на SQL израза.
За тези типове заявки обикновено е по-добре да създадете временно таблици
. Създайте такъв преди вашата заявка, вмъкнете всички идентификатори в него и го съединете с таблицата на обекта във вашата заявка, за да симулирате IN
състояние.
В идеалния случай можете да замените JPA със съхранена процедура, особено ако изваждате десетки хиляди идентификатори от базата данни, само за да ги предадете обратно към базата данни при следващото запитване.