Hibernate + Oracle IN ограничение пункта, как его решить? - PullRequest
6 голосов
/ 13 октября 2011

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

Используя Oracle, вы не можете передать в предложение IN более 1000 параметров, поэтому использование hibernate с oracle может иметь некоторыеРешения этой проблемы, такие как:

1 - используйте предложение OR между предложением IN для каждого списка 1000 параметров, но это не применимо из-за другого ограничения оракулом для всех параметров запроса, не превышающего 2000

2 - используйте цикл for, чтобы каждый раз запускать запрос в виде списка 1000 параметров, а затем добавлять все результаты, это не очень хорошо, если вам нужна сортировка, или использование критериев api с изменением другого уровня

3 - поместить список параметров во временную физическую таблицу и присоединиться к нему, или даже использовать его в подкритериях, и я не могу попробовать это решение, потому что я не знаю, как создать временную таблицу.таблица с использованием Hibernate, а затем используйте его,

, поэтому, если какие-либо другие мысли доступны с использованием CRITERIA api, пожалуйста, поделитесь им, или даже если есть простой способ передатьномер решения '3'

С уважением,

Ответы [ 2 ]

5 голосов
/ 13 октября 2011

Во-первых, тот факт, что вам нужно передать более 2000 идентификаторов (судя по вашей 1-й точке) на запрос, сам по себе является предупредительным звонком.Возможно, есть лучший способ решения основной проблемы.

Вы можете использовать подход № 2 и отсортировать каждый список, а затем выполнить сортировку слиянием в приложении.Это потребует дополнительного кода, но, вероятно, (при условии, что фактический запрос относительно быстрый) будет работать лучше, чем подход № 3.

Для # 3 есть 2 больших недостатка в работе с временными таблицами:

  • , хотя Hibernate поддерживает их (посмотрите на метод Table.sqlTemporaryTableCreateString, он использует кучу поддерживающих методов в классе Dialect), они используются внутри и потребуют дополнительного кодирования с вашей стороны, чтобы они были доступны изприложение.
  • , что более важно, использование временной таблицы заставит вас написать свой запрос как собственный SQL (поскольку он не будет отображаться).Если вы используете Criteria API, вам придется использовать sqlRestriction с подзапросом.
2 голосов
/ 03 октября 2014

С небольшой помощью списков гуавы и спящего режима гибернации:

    Disjunction disjunction = Restrictions.disjunction();
    for (List<?> chunkList: Lists.partition(largeList, 1000)) {
        disjunction.add(Restrictions.in(propertyName, chunkList));
    }
    criteria.add(disjunction);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...