Вызвано: java.sql.SQLException: ORA-01795: максимальное количество выражений в списке 1000? - PullRequest
5 голосов
/ 13 марта 2012

Я использую Java / Hibernate / Oracle. У меня есть список с более чем 3000 записей. если я пропущу весь список, я получу исключение ниже.

Вызывается: java.sql.SQLException: ORA-01795: максимальное количество выражений в списке 1000

Чтобы решить проблему, я делю список на подсписки, каждый подсписок будет иметь 1000 записей. для каждой тысячи записей я запускаю запрос. работает нормально.

Пожалуйста, уточните мне, есть ли лучшее решение?

Спасибо!

Ответы [ 4 ]

7 голосов
/ 13 марта 2012

Это ограничение Oracle, поэтому у него есть код ошибки Oracle ... хотя вы можете утверждать, что это ограничение Hibernate, что оно не работает прозрачно:)

Вы, вероятно, должны поместить список во временную таблицу и присоединиться к ней, предполагая, что у Oracle нет ничего похожего на табличных параметров SQL Server . (Или вы можете разбить ваш запрос на несколько запросов, потенциально - это зависит от того, что вы делаете.)

1 голос
/ 13 марта 2012

Exception-Text позволяет мне поверить, что это исходит из Oracle-Database - посмотрите на номер ошибки ...

0 голосов
/ 05 сентября 2013

Вы не можете иметь список с более чем 1000 элементами в одном условии «где», если вы работаете с БД Oracle. Таким образом, вы можете разбить ваше условие «где» в нескольких «где» условиях и соединить их с помощью «или».

Если вы используете Критерии гибернации, вы можете использовать приведенный ниже метод Java для этого. Просто замените свой код там, где вы когда-либо использовали

criteria.add(Restrictions.in(propertyName, mainList));

с

addCriteriaIn(propertyName, mainList, criteria);

который метод:

 private void addCriteriaIn (String propertyName, List<?> list,Criteria criteria)
  {
    Disjunction or = Restrictions.disjunction();
    if(list.size()>1000)
    {        
      while(list.size()>1000)
      {
        List<?> subList = list.subList(0, 1000);
        or.add(Restrictions.in(propertyName, subList));
        list.subList(0, 1000).clear();
      }
    }
    or.add(Restrictions.in(propertyName, list));
    criteria.add(or);
  }
0 голосов
/ 25 июля 2013

есть и другой способ решения этой проблемы.Допустим, у вас есть две таблицы Table1 и Table2.и требуется извлечь все записи таблицы 1, которые не указаны / не представлены в таблице 2, с использованием запроса критериев.Итак, продолжайте, как это ...

List list=new ArrayList(); 
Criteria cr=session.createCriteria(Table1.class);
cr.add(Restrictions.sqlRestriction("this_.id not in (select t2.t1_id from Table2 t2 )"));
.
.





List list=new ArrayList();
Criteria cr=session.createCriteria(Table1.class);
cr.add(Restrictions.sqlRestriction("this_.id not in (select t2.t1_id from Table2 t2 )"));
list=cr.list();
.
.
.

Он выполнит все вычисления подзапроса непосредственно в SQL без включения 1000 или более параметров в SQL, преобразованных средой Hibernate.Это сработало для меня.Примечание. Возможно, вам потребуется изменить часть SQL согласно вашему требованию.

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