Bonsoir la team,
je rencontre un problème auquel je ne trouve pas de solution.
J'ai une requête qui doit contenir un grand ensemble de valeurs, supérieur à 100.
Avec Java et Hibernate, si je veux filtrer mes valeurs en faisant :
J'obtiens l'erreur ORA-01795 "nombre maximum d'expressions autorisé dans une liste est de 1000".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 criteria.add(Restrictions.in(criteriaName, listOfValues);
Du coup, je souhaiterais découper ma requête en sous requête.
Voici le code qui permet de faire cela:
Le problème vient de la requête générée. Au lieu de mettre des "OR" entre les sous-listes, Hibernate met des "AND".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 int maxValues = 1; int nbValues = listOfValues.size(); // Determine the number of sub lists to be created. int nbCriteria = (int) (nbValues / maxValues); nbCriteria = (nbCriteria * maxValues == nbValues) ? nbCriteria : nbCriteria + 1; // Create the sub lists related to the criteria. int startIndex = 0, stopIndex = startIndex + maxValues; for (int i = 0; i < nbCriteria; i++) { if (stopIndex > nbValues) { stopIndex = nbValues; } if (i == 0) { criteria.add(Restrictions.in(criteriaName, listOfValues.subList(startIndex, stopIndex))); } else { criteria.add(Restrictions.or(Restrictions.in(criteriaName, listOfValues.subList(startIndex, stopIndex)))); } startIndex += maxValues; stopIndex += maxValues; }
Voyez-vous un moyen pour contourner ce problème ?
Merci d'avance de votre aide,
berni.
Partager