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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
criteria.add(Restrictions.in(criteriaName, listOfValues);
J'obtiens l'erreur ORA-01795 "nombre maximum d'expressions autorisé dans une liste est de 1000".

Du coup, je souhaiterais découper ma requête en sous requête.

Voici le code qui permet de faire cela:

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;
    }
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".
Voyez-vous un moyen pour contourner ce problème ?

Merci d'avance de votre aide,
berni.