2012-03-13 25 views
5

Estoy usando java/hibernate/Oracle. tengo una lista con más de 3000 entradas. si paso toda la lista, me sale debajo la excepción.Causado por: java.sql.SQLException: ORA-01795: el número máximo de expresiones en una lista es 1000?

causada por: java.sql.SQLException: ORA-01795: número máximo de expresiones en una lista es 1000

para resolver el problema que estoy división de la lista en sublistas, cada sublista tendrá 1000 entradas. por cada mil entradas estoy disparando una consulta. está funcionando bien

Aclarenme, ¿hay alguna solución mejor?

Gracias!

+0

ORA-01795 es un código de error de Oracle, lo que sugeriría que se trata de una Oracle, en lugar de Hibernate, limitación. –

Respuesta

7

Es una limitación de Oracle, por lo que tiene un código de error de Oracle .. . Aunque podría argumentar que es una limitación de Hibernate que no funciona de forma transparente :)

Probablemente debería poner la lista en una tabla temporal y unirse a eso, asumiendo que Oracle no tiene nada como SQL Servidor table-valued parameters. (O puede dividir su consulta en varias consultas, potentaly - depende de lo que esté haciendo).

+0

+1 para la solución alternativa :) Además: Una búsqueda rápida en Google revela numerosas publicaciones de personas con el mismo problema, por lo que puede haber ya algunos enfoques para superar esta restricción ... – quaylar

1

La Excepción de texto me permite creer que éste es el de la base de datos de Oracle-- mirar el número de errores ...

0

también hay otra manera de resolver este problema. digamos que tiene dos tablas Tabla1 y Tabla2. y se requiere obtener todas las entradas de la Tabla 1 no referida/presente en la Tabla 2 usando la consulta Criteria. Así visto bueno como este ...

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(); 
. 
. 
. 

se llevará a cabo todo el finction sub consulta directamente en SQL sin incluir 1000 o más parámetros en SQL convertidos por el marco de hibernación. Funcionó para mí Nota: Es posible que necesite cambiar la porción de SQL según su requisito.

+1

por favor, asegúrese de leer la ayuda de formateo:) – kleopatra

+0

@kleopatra, gracias por señalarlo :-) Lo he editado –

0

No puede tener una lista con más de 1000 elementos en una sola condición "where" si está trabajando con Oracle DB. Entonces puede cortar su condición de "dónde" en múltiples condiciones de "dónde" y unirlas con la cláusula "o".

Si está utilizando criterios de hibernación, puede utilizar el siguiente método de Java para hacerlo. basta con sustituir el código donde quiera que utilizó

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

con

addCriteriaIn(propertyName, mainList, criteria); 

el que el método es:

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); 
    } 
Cuestiones relacionadas