JPA и 1000 ID используются в Oracle IN Operator - PullRequest
0 голосов
/ 17 сентября 2018

Я использую NamedNativeQuery для удаления строк, и это выглядит примерно так:

DELETE from FAKTOR
 where ID IN (
   select fa.ID
   from FAKTOR fa
     left join FAKTOR_REASON fars
       on fa.FARS_ID = fars.ID
   where fars.ID = 63
         and fa.USER_ID in (:userIds))

Но как я могу использовать более 1000 пользовательских идентификаторов с оператором IN в Oracle, где подсказки?

P.S: Я ищу решение, чтобы справиться с ним за один коммит;

1 Ответ

0 голосов
/ 17 сентября 2018

Работа вокруг предела IN неэффективна, и JPA не всегда является подходящим инструментом для работы.Примите во внимание следующее:

  1. Тысячи связанных значений приведут к потенциально мегабайтам SQL.Отправка этого SQL в базу данных займет много времени.База данных может занять больше времени, чтобы прочитать текст SQL, чем выполнить его в соответствии с ответом Тома на вопрос "Ограничение и преобразование очень длинный IN: ГДЕ x IN (,,, ...)" вопрос .

  2. Это будет неэффективно из-за синтаксического анализа SQL.Не только требуется много времени для анализа этого длинного SQL, но каждый вызов имеет различное количество связанных параметров, которые будут анализироваться и планироваться отдельно (см. эту статью, которая объясняет это ).

  3. В операторе SQL существует жесткое ограничение связанных параметров.Вы можете повторить OR несколько раз, чтобы обойти предел IN, но в какой-то момент вы достигнете предела операторов SQL.

Для этих типов запросов этообычно лучше создать временных таблиц .Создайте один перед вашим запросом, вставьте в него все идентификаторы и объедините его с таблицей сущностей в вашем запросе, чтобы смоделировать условие IN.

В идеале вы можете заменить JPA хранимой процедурой, особенно если вы извлекаете десятки тысяч идентификаторов из базы данных, чтобы передать их обратно в базу данных в следующем запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...