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 :

Requête IN avec couple de valeurs


Sujet :

Hibernate Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 143
    Points : 68
    Points
    68
    Par défaut Requête IN avec couple de valeurs
    Bonjour

    Je souhaite exécuter une requête du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select id from table1 where (col1,col2) in ( ('val1','val2') , ('val3','val4') , ... );
    Comment faire pour passer en paramètre la liste des couples de valeurs dans le IN ? Doit-on passer une collection de tableau d'objets ?
    Chaque entrée de la collection serait un tableau d'objet et correspondrait au couple. Chaque tableau d'objet contiendrait les deux valeurs qui forment le couple ...

    J'ai essayé ceci en HQL, mais ça sort une exception :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    final Set<String[]> couples = new HashSet<String[]>();
    couples.add(new String[] { "val1", "val2" });
    couples.add(new String[] { "val3", "val4" });
     
    String req = "select t.id from Table1 t where (t.col1,t.col2) in (:couples)";
    final Query query = session.createQuery(req);
    query.setParameterList("couples", couples);
    final List<String> res = query.list();
    Exception :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    2009-02-19 12:22:33,044 [main] [WARN] org.hibernate.util.JDBCExceptionReporter - SQL Error: 920, SQLState: 42000
    2009-02-19 12:22:33,044 [main] [ERROR] org.hibernate.util.JDBCExceptionReporter - ORA-00920: invalid relational operator
    Merci d'avance pour votre aide

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    J'arrive à comprendre que ça ne passe pas avec un Set...
    Peux-tu essayer avec un tableau de String initialisé comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String[][] couples = new String[][] {{"val1", "val2"}, {"val1", "val3"}};
    A+

    PS : Ceci dit, je ne sais pas si c'est du standard SQL, ça fonctionne effectivement avec MySQL mais sur d'autres bases ???
    En tout cas, je n'ai pas encore vérifié sur du DB2 ou Oracle

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Avec un tableau de String initialisé, ça ne marche pas non plus.

    Personne n'a de solution ?

  4. #4
    Membre expérimenté Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Points : 1 337
    Points
    1 337
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * 
    FROM matable as m 
    WHERE (m.champ1, m.champ2, m.champ3) IN (valeur1, valeur2, valeur3);
    est bien un standard SQL. Cette requete passe sur la plupart des bases (Oracle, Mysql, Postgresql...).

    Quand ce type de requete est executé, une exception est levée, l'erreur est au niveau de la virgule juste apres le WHERE (apres champ1).

    Ce qui est sur, c'est que HQL ne supporte pas cette syntaxe.
    La seule syntaxe qui peut etre utilisée est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * 
    FROM matable as m 
    WHERE (m.champ1) IN (valeur1, valeur2, valeur3);
    [edit] j'ai repris cette discussion car je butte sur le même problème mais je n'ai pas trouvé de solution... peut être dans les prochaines versions de HQL [/edit]

  5. #5
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    On peut toujours ruser avec des OR :
    est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((x=a AND y=b) OR (x=c AND y=d))
    Il est assez facile de faire une méthode qui écrive ceci pour éviter la pénibilité qui en en o(n²) ^^

  6. #6
    Membre expérimenté Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Points : 1 337
    Points
    1 337
    Par défaut
    L'intérêt d'utiliser ce genre de requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * 
    FROM matable as m 
    WHERE (m.champ1, m.champ2, m.champ3) IN (valeur1, valeur2, valeur3);
    est que la requete générée ne fait pas un km...

  7. #7
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Certes, mais quand on génère la requête par Java, la longueur de la requête est peu importante, non ?

  8. #8
    Membre expérimenté Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Points : 1 337
    Points
    1 337
    Par défaut
    je suis pas sur de bien comprendre. la requete est bien envoyée au SGBD ? et c'est bien ca le problème... ca peut poser des problèmes de perf...

Discussions similaires

  1. Réponses: 11
    Dernier message: 08/08/2017, 22h08
  2. Plusieurs requêtes paramètres avec la même valeur
    Par rapheb dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 28/03/2013, 20h27
  3. Requête SQL avec valeur format Date
    Par delavega dans le forum ASP
    Réponses: 5
    Dernier message: 14/06/2007, 17h57
  4. Select IN avec un couple de Valeurs
    Par GregHory dans le forum DB2
    Réponses: 3
    Dernier message: 07/03/2007, 16h35
  5. Réponses: 2
    Dernier message: 31/01/2007, 09h49

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