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 :

Probleme sur requete avec LIKE


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
    Avril 2009
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 72
    Par défaut Probleme sur requete avec LIKE
    Bonjour.

    Je cherche actuellement à récupérer les acteurs présents dans ma base de donnée et pour faciliter la recherche j'utilise LIKE.

    Quand je fais ma requête sous MySql, aucun soucis.

    Seulement des que je la lance sous Eclipse, j'ai le droits à :

    javax.servlet.ServletException: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? and ACTEUR_PRENOM LIKE ?' at line 1
    Voici le code de la requête :

    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
     
    		Connection cnx = (Connection) ConnexionJdbc.getConnexion();
    		String sql = "SELECT * FROM acteur WHERE ACTEUR_NOM LIKE ? and ACTEUR_PRENOM LIKE ?";
     
    		PreparedStatement pstmt = (PreparedStatement) cnx.prepareStatement(sql);
    		pstmt.setString(1, "%"+unActeur.getNom()+"%");
    		pstmt.setString(2, "%"+unActeur.getPrenom()+"%");
     
     
    		List<Acteur> liste = new ArrayList<Acteur>();;
     
    		ResultSet rs = pstmt.executeQuery(sql);
     
    		while(rs.next()){
    			Acteur unActeur2 = new Acteur();
    			unActeur2.setId(rs.getInt("ACTEUR_ID"));
    			unActeur2.setNom(rs.getString("ACTEUR_NOM"));
    			unActeur2.setPrenom(rs.getString("ACTEUR_PRENOM"));
    			liste.add(unActeur2);
    		}
    J'ai essayé pas mal de choses mais je bloque complètement.

    Merci d'avance de vos futures réponses

  2. #2
    Membre expérimenté Avatar de dariyoosh
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 236
    Par défaut
    Bonjour,

    Je pense que LIKE ? ne peut pas être accepté car PreparedStatement est pré-compilé (une seule fois compilé) donc pour que le syntax soit vérifié il faut que l'expression soit connue, normalement PreparedStatement est utilisé pour remplacer la valeurs des colonnes ou des valeurs scalaires dans les clauses WHERE, IN etc.

    Par contre si on écrit LIKE ?, le compilateur ne peut pas vérifier le syntax car pour les expressions régulières il faut d'abord que le syntax de ce qui est après LIKE soit valid.

  3. #3
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dariyoosh Voir le message
    Je pense que LIKE ? ne peut pas être accepté car PreparedStatement est pré-compilé (une seule fois compilé) donc pour que le syntax soit vérifié il faut que l'expression soit connue, normalement PreparedStatement est utilisé pour remplacer la valeurs des colonnes ou des valeurs scalaires dans les clauses WHERE, IN etc.

    Par contre si on écrit LIKE ?, le compilateur ne peut pas vérifier le syntax car pour les expressions régulières il faut d'abord que le syntax de ce qui est après LIKE soit valid.
    Bien sûr qu'on peut utiliser like ?, heureusement...

    Peux-tu montrer la trace complète de l'erreur ?

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 72
    Par défaut
    Voici l'erreur complète

    INFO: Tiles definition factory found for request processor ''.
    23 avr. 2009 10:41:03 org.apache.struts.action.RequestProcessor processException
    ATTENTION: Unhandled Exception thrown: class com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException
    23 avr. 2009 10:41:03 org.apache.catalina.core.StandardWrapperValve invoke
    GRAVE: "Servlet.service()" pour la servlet action a g�n�r� une exception
    com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? and ACTEUR_PRENOM LIKE ?' at line 1
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
    at com.mysql.jdbc.Util.getInstance(Util.java:381)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3515)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3447)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1951)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2101)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2548)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2477)
    at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1422)
    at fr.http://www.films.actions.ActionReche...Acteur.java:45)
    at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
    at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Unknown Source)

  5. #5
    Membre expérimenté Avatar de dariyoosh
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 236
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Bien sûr qu'on peut utiliser like ?, heureusement...
    Ah bon?

    Dans ce cas je vais te montrer un petit exemple sur la base de données Oracle 11g.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TABLE mytable(id VARCHAR2(10), code NUMBER);
     
    INSERT INTO mytable(id, code) VALUES('ext01', 125);
    INSERT INTO mytable(id, code) VALUES('ext0157', 27125);
    INSERT INTO mytable(id, code) VALUES('ext0124', 4025);
    INSERT INTO mytable(id, code) VALUES('max17', 8741);
    INSERT INTO mytable(id, code) VALUES('max120', 11);
    Dans ce cas si tu écris dans le shell SQL*Plus la requête suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT *
    FROM mytable
    WHERE (REGEXP_LIKE(id, 'ext[[:digit:]]+'));
    Le résultat sera:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ID		     CODE
    ----------          ----------
    ext01                125
    ext0157 	      27125
    ext0124 	      4025
     
    SQL>

    Maintenant tu me dis que c'est tout à fait possible d'exécuter cette requête avec
    PreparedStatement en remplaçant l'expression 'ext[[:digit:]]+' par ?.
    On va voir si ça marche.

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    package servlets;
     
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.sql.*;
     
     
    public class Servlet1 extends HttpServlet
    {
        @Override
        protected void doGet(HttpServletRequest request,
                HttpServletResponse response)
        throws ServletException, IOException
        {
            doPost(request, response);
        } 
     
     
        @Override
        protected void doPost(HttpServletRequest request,
                HttpServletResponse response)
        throws ServletException, IOException
        {
            PrintWriter writer = response.getWriter();
     
            String query = "SELECT * "+
                           "FROM mytable "+
                           "WHERE (REGEXP_LIKE(id, ?))";
     
            String username="scott";
            String password="tiger";
            String dbURL="jdbc:oracle:thin:@localhost:1521:database01";
     
            try
            {
                Connection connection = DriverManager.getConnection (dbURL, username, password);
     
                PreparedStatement preparedStatement = connection.prepareStatement(query);
     
                preparedStatement.setString(1, "'ext[[:digit:]]+'");
                ResultSet resultSet = preparedStatement.executeQuery();
     
                if (resultSet.next())
                     writer.println("Oui, il y a eu un résultat");
                else
                     writer.println("non il n'y a eu aucun résultat");
     
     
                resultSet.close();
                preparedStatement.close();
                connection.close();
            }
            catch (SQLException e)
            {
                e.printStackTrace();
                writer.println(e.getMessage());
            }
     
            writer.close();
        }
    }
    Tu vas donc exécuter ce programme et si par hasard tu as le message "Oui, il y a eu un résultat" qui s'affiche dans ton navigateur, tu me diras! Bon courage!

  6. #6
    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
    Billets dans le blog
    1
    Par défaut
    Si ça ne fonctionne pas avec l'instruction REGEXP_LIKE (ce n'est pas du standard SQL), c'est un problème Oracle, ça ne remet pas en cause le fait qu'on peut utiliser " ... like ? ..." dans un PreparedStatement
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre expérimenté Avatar de dariyoosh
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 236
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Si ça ne fonctionne pas avec l'instruction REGEXP_LIKE (ce n'est pas du standard SQL), c'est un problème Oracle, ça ne remet pas en cause le fait qu'on peut utiliser " ... like ? ..." dans un PreparedStatement
    D'accord, si tu veux voici la version avec MySQL et avec LIKE (standard SQL) qui ne fonctionne non plus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TABLE mytable(id VARCHAR(10), code SMALLINT);
     
    INSERT INTO mytable(id, code) VALUES('ext01', 125);
    INSERT INTO mytable(id, code) VALUES('ext0157', 27125);
    INSERT INTO mytable(id, code) VALUES('ext0124', 4025);
    INSERT INTO mytable(id, code) VALUES('max17', 8741);
    INSERT INTO mytable(id, code) VALUES('max120', 11);


    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    package servlets;
     
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.sql.*;
    import java.util.*;
    import prettyprinter.*;
     
     
     
    public class Servlet1 extends HttpServlet
    {
        @Override
        protected void doGet(HttpServletRequest request,
                HttpServletResponse response)
        throws ServletException, IOException
        {
            doPost(request, response);
        } 
     
     
        @Override
        protected void doPost(HttpServletRequest request,
                HttpServletResponse response)
        throws ServletException, IOException
        {
            PrintWriter writer = response.getWriter();
     
            String query = "SELECT * "+
                           "FROM mytable "+
                           "WHERE (id LIKE ?)";
     
            String username="lrngsql";
            String password="password";
            String dbURL="jdbc:mysql://localhost:3306/film_database";
     
            try
            {
                Connection connection = DriverManager.getConnection
                        (dbURL, username, password);
     
     
                PreparedStatement preparedStatement =
                        connection.prepareStatement(query);
     
                /*  LIKE 'ext%' est bien du standard SQL  */
                preparedStatement.setString(1, "'ext%'");
                ResultSet resultSet = preparedStatement.executeQuery();
     
                if (resultSet.next())
                    writer.println("Oui, il y a eu un résultat");
                else
                    writer.println("no il n'y a eu aucun résultat");
     
     
     
                resultSet.close();
                preparedStatement.close();
                connection.close();
            }
            catch (SQLException e)
            {
                e.printStackTrace();
                writer.println(e.getMessage());
            }
     
            writer.close();
        }
    }

    Toujours, le même problème.

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 764
    Par défaut
    Citation Envoyé par cryosore Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    String sql = "SELECT * FROM acteur WHERE ACTEUR_NOM LIKE ? and ACTEUR_PRENOM LIKE ?";
     
    PreparedStatement pstmt = cnx.prepareStatement(sql);
    pstmt.setString(1, "%"+unActeur.getNom()+"%");
    pstmt.setString(2, "%"+unActeur.getPrenom()+"%");
     
    ResultSet rs = pstmt.executeQuery(sql);
    Tu prépares ta requête, tu donnes leurs valeurs aux paramètres... et ensuite tu exécutes la requête SQL non "préparée".

    Essaie plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ResultSet rs = pstmt.executeQuery();

  9. #9
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Astartee Voir le message
    Tu prépares ta requête, tu donnes leurs valeurs aux paramètres... et ensuite tu exécutes la requête SQL non "préparée".

    Essaie plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ResultSet rs = pstmt.executeQuery();
    +1
    C'était tellement gros que je ne l'ai pas vu
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 72
    Par défaut


    Merci beaucoup effectivement le soucis venais bien de là.

    C'est vraiment une erreur de codage bête et méchante

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

Discussions similaires

  1. Probleme de requete avec MAX sur champ de type date
    Par boutmos dans le forum Requêtes
    Réponses: 6
    Dernier message: 11/04/2013, 10h02
  2. Probleme sur requete avec jour manquant
    Par calou_33 dans le forum SQL
    Réponses: 5
    Dernier message: 27/01/2011, 10h14
  3. Requete avec LIKE sur du texte avec des slash
    Par mkaffel dans le forum Requêtes
    Réponses: 4
    Dernier message: 18/12/2007, 12h07
  4. Probleme de requete avec LIKE
    Par mikl974 dans le forum Hibernate
    Réponses: 1
    Dernier message: 18/10/2007, 17h58
  5. probleme de requete avec reprise du resultat :
    Par Maxoo dans le forum Langage SQL
    Réponses: 6
    Dernier message: 13/12/2004, 20h05

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