IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Hibernate Java Discussion :

Erreur ORA-01795 "nombre maximum d'expressions autorisé dans une liste est de 1000"


Sujet :

Hibernate Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 200
    Points : 66
    Points
    66
    Par défaut Erreur ORA-01795 "nombre maximum d'expressions autorisé dans une liste est de 1000"
    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.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Elle viens d'où cette liste de valeurs? Je doute que l'utilisateur aie coché joyeusement 1000 cases. Donc si elle viens d'une autre requete, ta solution c'est de virer cette liste de valeurs et remplacer par une sous requete qui ressort cette liste.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 200
    Points : 66
    Points
    66
    Par défaut
    Cette liste de valeur est renseignée au fur et à mesure d'un traitement.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tu ne peux pas faire tes requêtes hibernate aussi au fur et à mesure, plutôt que d'être coincé sur la fin? Devoir tapper manuellement une liste de 1000 entrée dans un in(), ça dénote généralement d'une problème de conception, ça fait chier le SGBD à optimiser une requête pareille, ca doit bouffer du temps à exécuter

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Comme dit tchize_, la sous requête paraît bien placée pour contourner la limite, sinon, il y a aussi la jonction qui pourrait fonctionner.
    Peux-tu mettre la structure des tables utilisées ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/11/2010, 13h56
  2. [AC-2003] une expression valide dans une requete retourne #Erreur
    Par mamadouabd dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 08/10/2009, 19h46
  3. Réponses: 8
    Dernier message: 11/11/2008, 17h33
  4. Nombre d options a afficher dans une liste (select)
    Par wwluigi dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 16/01/2007, 15h17
  5. Erreur ORA-00979 : not a GROUP BY expression sur Oracle9i
    Par Dirty Henry dans le forum Oracle
    Réponses: 9
    Dernier message: 21/10/2005, 14h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo