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

JDBC Java Discussion :

Requête sql + java


Sujet :

JDBC Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 61
    Par défaut Requête sql + java
    Bonjour,

    Je veux faire une requête avec like xx%, sauf que sa marche pas (like :supName%), quelle syntaxe pour avoir les enregistrements commançant par le paramètre ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public List<Supervisor> searchForCriteria(String supName) {
     
    	String[] names = { "supName"};
    	Object[] values = { supName};
     
     
    	String request  = "FROM " + Supervisor.class.getName()+  " WHERE  SUP_NAME LIKE :supName";	
     
    	return getHibernateTemplate().findByNamedParam(request, names, values);
    }
    D'avance merci

  2. #2
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Je me suis posé la même question il y a quelque jour
    La solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String str= "commence";
     String request = "SELECT * FROM table WHERE SUP_NAME like '"+str+"%' ;");

  3. #3
    Membre émérite Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Par défaut
    Alors par contre ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String request = "SELECT * FROM table WHERE SUP_NAME like '"+str+"%' ;");
    C'est à bannir complétement (pour des applis plus ou moins sensibles) pour cause de possibilités de SQL Injection.
    Il vaut mieux utiliser des PreparedStatement

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 61
    Par défaut
    J'ai essayé comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String request  = "FROM " + Supervisor.class.getName()+  " WHERE  SUP_NAME LIKE '" + ":supName" + "%'";
    Mais j'ai l'erreur :
    java.lang.IllegalArgumentException: Parameter supName does not exist as a named parameter in [FROM com.bv.fluides.mapping.entities.Supervisor WHERE SUP_NAME LIKE ':supName%']

  5. #5
    Membre émérite Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Par défaut
    apparemment :supName est un paramètre, c'est plutôt dans la String que tu passes après qu'il faut ajouter le %
    un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    setParameter("supName",taString+"%");
    et les simples quotes "à la main" pas sûr que ce soit bon...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 61
    Par défaut
    supName est l'attribut de la classe Supervisor

  7. #7
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    les simples quotes "à la main" pas sûr que ce soit bon...
    Pour les simples quotes, on m'a appris qu'il fallait les mettre quand il y avait une chaines de caractères.

    Pourquoi dis tu que ce n'est pas forcement bon ?

  8. #8
    Membre émérite Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Par défaut
    en gros ce qui n'est pas terrible c'est de construire la requête à la main, ou du moins la partie où on ajoute les paramètres

    en JDBC basique on utilise pour ça les PreparedStatement avec des ? à la place des paramètres, et des setInt setString etc... en fonction du type
    quand on utilise une API faire les requêtes, c'est un peu le même principe on ne construit pas à la main non plus la partie où on passe les paramètres
    dans ces deux cas ce n'est pas toi qui te charges d'ajouter les quotes, c'est fait automatiquement en gros

    si tu fais ça à la main justement avec les simples quotes ta fonction ne pourra pas prendre en compte toutes les chaînes et tu t'exposes à de l'injection SQL

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String s = "SELECT * FROM users WHERE login= ' "+loginString+" ' ";
    (j'ai mis des espaces avant et après les simples quotes uniquement pour plus de clareté)

    si loginString = '[nimportequoi] la simplequote ferme la chaîne ouverte et ping ça plante
    pire avec loginString du style ' OR 1=1 ' la requête peut toujours retourner des résultats alors que ce n'est pas ce qu'on veut

    pour plus d'infos sur les PreparedStatement : la FAQ

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requête SQL de base sous java avec Hibernate
    Par ritchie23 dans le forum JDBC
    Réponses: 0
    Dernier message: 29/10/2008, 09h54
  2. Java requête SQL quote antislash
    Par ritchie23 dans le forum Débuter avec Java
    Réponses: 11
    Dernier message: 01/10/2008, 16h50
  3. Requête SQL 'UPDATE' en Java
    Par Grulf dans le forum JDBC
    Réponses: 5
    Dernier message: 11/06/2008, 09h32
  4. copier une requête sql dans un code java
    Par Smix007 dans le forum Langage
    Réponses: 2
    Dernier message: 05/04/2008, 15h14
  5. Réponses: 8
    Dernier message: 11/08/2006, 09h30

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