Partage
  • Partager sur Facebook
  • Partager sur Twitter

Gérer requete SQL avec critères variables en J2EE

    24 novembre 2014 à 17:46:35

    Bonjour

    J'ai un formulaire avec 3 champs par exemple: nom, prénom, age. Je récupère ces 3 informations dans ma Servlet, je fais ceci pour traiter ces infos:

    ...
    String nom = request.getParameter( "nom");
    String prenom= request.getParameter( "prenom");
    String age= request.getParameter( "age");
    
    Strin requete = null;
    
    if ( nom!= null && prenom!= null && age!= null)
    {
      requete = "select * from user where nom = ?,prenom = ?, age = ?"
    }
    if (nom!=null && prenom!=null)
    {
     requete = "select * from user where nom = ?,prenom = ?"
    }
    if (nom!=null && age!=null)
    {
     requete = "select * from user where nom = ?,age= ?"
    }
    ...
    

    Donc j'aurais à créer plusieurs if {} correspondant à toutes les combinaisons possibles.

    J'aimerais donc savoir s'il y a une façon plus rapide et efficace de faire.

    Merci

    • Partager sur Facebook
    • Partager sur Twitter
      24 novembre 2014 à 18:56:50

      une proposition :

      créer un hashmap : cle valeur , la clé sera le nom du champs et la valeur sera la valeur entré par l'utilisateur

      tu fait un test pour :

      nom si non null tu l'ajout au hashmap 

      prenom si non null tu l'ajout au hashmap 

      age si non null tu l'ajout au hashmap 

      en fin de compte le hashmap sera rempli par que les champs remplit

      tu parcours le hashmap et tu construit ta requette

      • Partager sur Facebook
      • Partager sur Twitter
      Le succès n’est pas la clé du bonheur. Le bonheur est la clé du succès. Si vous aimez ce que vous faites, vous réussirez. Albert Schweitzer
        26 novembre 2014 à 23:45:50

        En fait si je remplis le hashmap par les champs remplis,la requête que j'aurais à construire dépendra du nombre de champ non null dans le hashmap. Donc je vois pas trop de différence entre ce que j'ai proposé ci-dessus.

        Tu vois ce que je veux dire?

        J'ai quand même débuté avec ceci:

        Map<String,String> map = new HashMap<String,String>();
        
        String nom = request.getParameter( CHAMP_NOM);
        String prenom = request.getParameter( CHAMP_PRENOM);
        String email = request.getParameter( CHAMP_EMAIL);
        
        if (!nom == null)
         {
          map.put(CHAMP_NOM, nom);
         }
        if (!prenom == null)
         {
          map.put(CHAMP_PRENOM, prenom);
         }
        if (!email == null)
         {
          map.put(CHAMP_EMAIL, email);
         }
        
        
        for ( String entree : map.keyset())
        {
          ...
        }

        A partir de là je cale.

        • Partager sur Facebook
        • Partager sur Twitter
          27 novembre 2014 à 0:34:16

          la diference c que tu vas construire ta requette une seule fois en se basant sur le hashmap
          • Partager sur Facebook
          • Partager sur Twitter
          Le succès n’est pas la clé du bonheur. Le bonheur est la clé du succès. Si vous aimez ce que vous faites, vous réussirez. Albert Schweitzer
            27 novembre 2014 à 0:47:15

            voila supposant que tu as remplit le hashmap:

            exemple:

            	Map myMap=new java.util.HashMap();
            		 
            		// Ajout des objet dans le tableau associatif
            		myMap.put("nom", "mon_nom");
            		myMap.put("pren", "pre");
            		
            
            		// Afficher le contenu du MAP
            		Set listKeys=myMap.keySet();  // Obtenir la liste des clés
            		Iterator iterateur=listKeys.iterator();
            		// Parcourir les clés et afficher les entrées de chaque clé;
            		String s="select * from where ";
            		while(iterateur.hasNext())
            		{
            			Object key= iterateur.next();
            			s=s+(String)key+" = ? ,";
            		}
            		
            		// supprimer la dernier vergule apres le traitement
            		// Afficher une entrée spécifique
            		
            		System.out.println ("res = "+s);

            resultat:

            res = select * from where nom = ? ,pren = ? ,

            j'espère que j'ai compris ton problème


            • Partager sur Facebook
            • Partager sur Twitter
            Le succès n’est pas la clé du bonheur. Le bonheur est la clé du succès. Si vous aimez ce que vous faites, vous réussirez. Albert Schweitzer
              27 novembre 2014 à 15:49:32

              Oui tu as exactement compris mon problème.

              Merci pour le code. J'ai essayé mais j'ai l'erreur suivante:

              dao.DAOException: java.sql.SQLException: No value specified for parameter 1
              	at dao.OffreDaoImpl.rechercheRapide(OffreDaoImpl.java:106)
              	at servlets.RechercheRapide.doPost(RechercheRapide.java:62)
              	at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
              	at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
              	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
              	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
              	at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
              	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
              	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
              	at filters.PrechargementFilter.doFilter(PrechargementFilter.java:66)
              	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
              	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
              	at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
              	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
              	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
              	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
              	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
              	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
              	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
              	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
              	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
              	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
              	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
              	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
              	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
              	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
              	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
              	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
              	at java.lang.Thread.run(Thread.java:744)
              Caused by: java.sql.SQLException: No value specified for parameter 1
              	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
              	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
              	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
              	at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2176)
              	at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2100)
              	at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1826)
              	at com.jolbox.bonecp.PreparedStatementHandle.executeQuery(PreparedStatementHandle.java:172)
              	at dao.OffreDaoImpl.rechercheRapide(OffreDaoImpl.java:101)
              	... 28 more
              
              

              Voici ma Class OffreDaoImpl:

              ...
              public class OffreDaoImpl implements OffreDao{
              
              private DAOFactory          daoFactory;
                  
              
                  OffreDaoImpl( DAOFactory daoFactory ) {
                      this.daoFactory = daoFactory;
                  }
              
              @Override
                  public List<Offre> rechercheRapide(String CHAMP_TYPE_OFFRE, String CHAMP_VILLE, String CHAMP_REGION, String CHAMP_SECTEUR,String typeOffre, String ville, String region, String secteur) throws DAOException {
                      
                       Map myMap=new java.util.HashMap();
                    
                          // Ajout des objet dans le tableau associatif
                         myMap.put(CHAMP_TYPE_OFFRE, typeOffre);
                         myMap.put(CHAMP_VILLE, ville);
                         myMap.put(CHAMP_REGION, region);
                         myMap.put(CHAMP_SECTEUR, secteur);
               
                  // Afficher le contenu du MAP
                  Set listKeys=myMap.keySet();  // Obtenir la liste des clés
                  Iterator iterateur=listKeys.iterator();
                  // Parcourir les clés et afficher les entrées de chaque clé;
                  String s="select * from Offre where ";
                  while(iterateur.hasNext())
                  {
                      Object key= iterateur.next();
                      s=s+(String)key+" = ? ,";
                  }
                      
                      Connection connection = null;
                      PreparedStatement preparedStatement = null;
                      ResultSet resultSet = null;
                      List<Offre> offres = new ArrayList<Offre>();
              
                      try {
                          connection = daoFactory.getConnection();
                          preparedStatement = connection.prepareStatement( s );
                          resultSet = preparedStatement.executeQuery();
                          while ( resultSet.next() ) {
                              offres.add( map( resultSet ) );
                          }
                      } catch ( SQLException e ) {
                          throw new DAOException( e );
                      } finally {
                          fermeturesSilencieuses( resultSet, preparedStatement, connection );
                      }
              
                      return offres;
                  }
              
               private static Offre map( ResultSet resultSet ) throws SQLException {
                      Offre offre = new Offre();
                      offre.setId( resultSet.getLong( "id_offre" ) );
                      offre.setTypeOffre(resultSet.getString( "type_offre" ));
                      offre.setVille(resultSet.getString( "ville" ));
                      offre.setRegion(resultSet.getString( "region" ));
                      offre.setNomEmploy(resultSet.getString( "nom_employ" ));
                      offre.setNomOffre(resultSet.getString( "nom_offre" ));
                      offre.setDateLimite(resultSet.getString( "date_limite" ));
                      offre.setSecteur(resultSet.getString( "secteur" ));   
                      offre.setPoste(resultSet.getString( "poste" )); 
                      offre.setNiveau(resultSet.getString( "niveau" ));
                      
                      return offre;
                  }
              
              }

              Et voici ma Servlet:

              ...
              public class RechercheRapide extends HttpServlet {
              
              private static final String CHAMP_TYPE_OFFRE = "type_offre";
                  private static final String CHAMP_VILLE = "ville";
                  private static final String CHAMP_REGION = "region";
                  private static final String CHAMP_SECTEUR = "secteur";
              
              public void doPost( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {
              
              HttpSession session =  request.getSession();
                      
                      String typeOffre = getValeurChamp( request, CHAMP_TYPE_OFFRE );
              String ville = getValeurChamp( request, CHAMP_VILLE );
              String region = getValeurChamp( request, CHAMP_REGION );
              String secteur = getValeurChamp( request, CHAMP_SECTEUR);
              
              List<Offre> listeOffres = offreDao.rechercheRapide(CHAMP_TYPE_OFFRE, CHAMP_VILLE, CHAMP_REGION, CHAMP_SECTEUR, typeOffre, ville, region, secteur);
                       Map<Long, Offre> mapListeOffres = new HashMap<Long, Offre>();
                          for ( Offre offre : listeOffres )
                          {
                              mapListeOffres.put( offre.getId(), offre );
                          }
                          session.setAttribute( ATT_SESSION_OFF, mapListeOffres );
              
              }
              
                private static String getValeurChamp( HttpServletRequest request, String nomChamp ) {
              String valeur = request.getParameter( nomChamp );
              if ( valeur == null || valeur.trim().length() == 0 ) {
              return null;
              } else {
              return valeur;
              }
              }
              
              }

              On dirait que le "?" de " s=s+(String)key+" = ? ,"; " n'est pas pris en compte.

              Merci



              • Partager sur Facebook
              • Partager sur Twitter
                27 novembre 2014 à 16:23:18

                Si tu as un peu de temps devant toi, tu pourrais te pencher sur Hibernate
                • Partager sur Facebook
                • Partager sur Twitter
                  27 novembre 2014 à 19:14:38

                  :( En fait je ne voulais pas intégrer les frameworks dans mon projet parce que je ne maitrise pas vraiment. J'ai déjà du retard sur le lancement de mon site web.

                  Je vais encore essayer de trouver ce qui cloche, mais si je n'y arrive pas je serais obligé de retourner à ma solution "archaïque".

                  Peut-être que d'ici là Maryamma ou quelqu'un d'autre me dira ce qui ne va pas.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    28 novembre 2014 à 11:00:05

                    Salut,

                    La méthode qu'a donné Maryamma ne te donne que la requête, il faut derrière que tu valorises les paramètres dans ta méthode rechercheRapide.

                    Lors de la valorisation de ta HashMap, pense à tester si tes données ne sont pas null comme tu le faisais un peu plus haut, c'est une étape à laquelle tu ne pourras pas échapper et il vaut mieux le faire lors de la création de la Map que lors de l'itération de celle-ci afin de ne pas insérer de clés inutiles. Actuellement, que tes champs soit null ou non, ta requête a toujours les 3 paramètres et ce n'est pas ce que tu souhaites.

                    De plus je te conseille de déplacer tes constantes CHAMP_ vers ta classe OffreDaoImpl puisque c'est à elle de s'occuper de la base et pas à ta servlet. Cela t'évite en plus de les passer en paramètre de ta méthode !

                    • Partager sur Facebook
                    • Partager sur Twitter
                      28 novembre 2014 à 14:32:18

                      J'ai oublié de supprimer la dernière virgule

                      -
                      Edité par momjunior 28 novembre 2014 à 14:49:47

                      • Partager sur Facebook
                      • Partager sur Twitter
                        9 janvier 2015 à 23:10:29

                        Finalement j'ai trouvé d'où vient l'erreur. Au niveau de mon preparedStatement, j'avais les 3 autres paramètres.

                        J'avais ceci:

                        preparedStatement = connection.prepareStatement( requete );

                        Au lieu de:

                                    preparedStatement = initialisationRequetePreparee( connection, requete, false, typeOffre,ville,region,secteur );
                        

                        Mais il y a un dernier souci. Quand je fais ceci:

                         @Override
                            public List<Offre> rechercheRapide(String CHAMP_TYPE_OFFRE, String CHAMP_VILLE, String CHAMP_REGION, String CHAMP_SECTEUR,String typeOffre, String ville, String region, String secteur) throws DAOException {
                                
                                 Map myMap=new java.util.HashMap();
                              
                                    // Ajout des objet dans le tableau associatif
                                   myMap.put(CHAMP_TYPE_OFFRE, typeOffre);
                                   myMap.put(CHAMP_VILLE, ville);
                                   myMap.put(CHAMP_REGION, region);
                                   myMap.put(CHAMP_SECTEUR, secteur);
                                   
                         
                            // Afficher le contenu du MAP
                            Set listKeys=myMap.keySet();  // Obtenir la liste des clés
                            Iterator iterateur=listKeys.iterator();
                            // Parcourir les clés et afficher les entrées de chaque clé;
                            String s="select * from Offre where ";
                            while(iterateur.hasNext())
                            {
                                Object key= iterateur.next();
                                s=s+(String)key+" = ? and ";
                            }
                                System.out.println("la requete est: "+s);
                        ....




                        Ce résultat m'affiche:

                        la requete est: select * from Offre where region = ? and type_offre = ? and ville = ? and secteur = ? and

                        region vient en 1er, suivi de type_offre, ville et secteur.

                        Pourtant lorsque j'ajoute les valeurs dans la Map, c'est type_offre qui vient en 1er, suivi de ville, region et secteur.

                        Même dans ma Servlet l'ordre type_offre,ville, region, secteur est respecté:

                        public class RechercheRapide extends HttpServlet {
                         
                        private static final String CHAMP_TYPE_OFFRE = "type_offre";
                            private static final String CHAMP_VILLE = "ville";
                            private static final String CHAMP_REGION = "region";
                            private static final String CHAMP_SECTEUR = "secteur";
                         
                        public void doPost( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {
                         
                        HttpSession session =  request.getSession();
                                 
                                String typeOffre = getValeurChamp( request, CHAMP_TYPE_OFFRE );
                        String ville = getValeurChamp( request, CHAMP_VILLE );
                        String region = getValeurChamp( request, CHAMP_REGION );
                        String secteur = getValeurChamp( request, CHAMP_SECTEUR);
                         
                        List<Offre> listeOffres = offreDao.rechercheRapide(CHAMP_TYPE_OFFRE, CHAMP_VILLE, CHAMP_REGION, CHAMP_SECTEUR, typeOffre, ville, region, secteur);
                                 Map<Long, Offre> mapListeOffres = new HashMap<Long, Offre>();
                                    for ( Offre offre : listeOffres )
                                    {
                                        mapListeOffres.put( offre.getId(), offre );
                                    }
                                    session.setAttribute( ATT_SESSION_OFF, mapListeOffres );
                         
                        }
                         
                          private static String getValeurChamp( HttpServletRequest request, String nomChamp ) {
                        String valeur = request.getParameter( nomChamp );
                        if ( valeur == null || valeur.trim().length() == 0 ) {
                        return null;
                        } else {
                        return valeur;
                        }
                        }
                         
                        }

                        Donc je ne comprends pas pourquoi j'ai :

                        la requete est: select * from Offre where region = ? and type_offre = ? and ville = ? and secteur = ? and

                        Au lieu de:

                        la requete est: select * from Offre where type_offre = ? and ville = ? and region = ? and secteur = ? and

                        Merci




                        -
                        Edité par momjunior 9 janvier 2015 à 23:13:32

                        • Partager sur Facebook
                        • Partager sur Twitter
                          12 janvier 2015 à 23:11:02

                          C'est bon, il fallait juste utiliser une LinkedHashMap au lieu d'une Hashmap.

                          jazak Allahu khayran

                          -
                          Edité par momjunior 12 janvier 2015 à 23:13:53

                          • Partager sur Facebook
                          • Partager sur Twitter
                            14 janvier 2015 à 23:37:49

                            Euh...un nouveau souci :'(

                            J'ai bien appliqué tout ce que tu m'as dit. Voici mon code final, j'espère que tu arriveras à comprendre mon charabia:

                            /* Implémentation de la méthode définie dans l'interface CandidatDao */
                                @Override
                                public List<Offre> rechercheRapide(String CHAMP_TYPE_OFFRE, String CHAMP_VILLE, String CHAMP_REGION, String CHAMP_SECTEUR,String typeOffre, String ville, String region, String secteur) throws DAOException {
                                    
                                     Map myMap=new java.util.LinkedHashMap ();
                                     Map param=new java.util.LinkedHashMap ();
                                     
                                  if(!typeOffre.equals("select"))
                                  {
                                   myMap.put(CHAMP_TYPE_OFFRE, typeOffre);
                                   param.put("typeOffre", "typeOffre");
                                   System.out.println("la map type offre est: "+myMap.get(CHAMP_TYPE_OFFRE));
                                   System.out.println("le parametre type offre est: "+param.get("typeOffre"));
                                  }
                                        // Ajout des objet dans le tableau associatif
                                    if(!ville.equals("select"))
                                  {
                                   myMap.put(CHAMP_VILLE, ville);
                                   param.put("ville", "ville");
                                       System.out.println("la map ville est: "+myMap.get(CHAMP_VILLE));
                                       System.out.println("le parametre ville est: "+param.get("ville"));
                                  }  
                                  
                                    if(!region.equals("select"))
                                  {
                                   myMap.put(CHAMP_REGION, region);
                                   param.put("region", "region");
                                       System.out.println("la map region est: "+myMap.get(CHAMP_REGION));
                                       System.out.println("le parametre region est: "+param.get("region"));
                                  }
                                    
                                      if(!secteur.equals("select"))
                                  {
                                   myMap.put(CHAMP_SECTEUR, secteur); 
                                   param.put("secteur", "secteur");
                                       System.out.println("la map secteur est: "+myMap.get(CHAMP_SECTEUR));
                                       System.out.println("le parametre secteur est: "+param.get("secteur"));
                                  }
                                       String suite = "", list="";
                                    if(typeOffre.equals("select") && ville.equals("select") && region.equals("select") && secteur.equals("select"))
                                    {
                                    suite = "type_offre = ? and ville = ? and region = ? and secteur = ? and";
                                    list = "typeOffre,ville,region,secteur,";
                                    
                                    }
                                    else
                                    {
                                     suite = "";
                                     list = "";
                                    }
                                 
                                // Afficher le contenu du MAP
                                Set listKeys=myMap.keySet();  // Obtenir la liste des clés
                                Iterator iterateur=listKeys.iterator();
                                // Parcourir les clés et afficher les entrées de chaque clé;
                                String s="select * from Offre where "+suite;
                                while(iterateur.hasNext())
                                {
                                    Object key= iterateur.next();
                                    s=s+(String)key+" = ? and ";
                                }
                                    System.out.println("la requete est: "+s);
                                    String requete = s.substring(0, s.lastIndexOf("and"));
                                    System.out.println("la vraie requete est: "+requete);
                                    
                                    
                                    //Début de la 2e LinkedHashMap ********************************************************************
                                    
                                    // Afficher le contenu du MAP
                                Set listParam=param.keySet();  // Obtenir la liste des clés
                                Iterator iterateurParam=listParam.iterator();
                                // Parcourir les clés et afficher les entrées de chaque clé;
                                
                                while(iterateurParam.hasNext())
                                {
                                    Object key2= iterateurParam.next();
                                    list=list+(String)key2+",";
                                }
                                    System.out.println("la requete est: "+list);
                                    String requeteParam = list.substring(0, list.lastIndexOf(","));
                                    System.out.println("la requete pour les parametres est: "+requeteParam);
                                    
                                    //Fin de la 2e LinkedHashMap  ***********************************************************************
                                    
                                    Connection connection = null;
                                    PreparedStatement preparedStatement = null;
                                    ResultSet resultSet = null;
                                    List<Offre> offres = new ArrayList<Offre>();
                            
                                    try {
                                        connection = daoFactory.getConnection();
                                        preparedStatement = initialisationRequetePreparee( connection, requete, false, requeteParam );
                                        resultSet = preparedStatement.executeQuery();
                                        while ( resultSet.next() ) {
                                            offres.add( map( resultSet ) );
                                        }
                                    } catch ( SQLException e ) {
                                        throw new DAOException( e );
                                    } finally {
                                        fermeturesSilencieuses( resultSet, preparedStatement, connection );
                                    }
                            
                                    return offres;
                                }
                                

                            Voici mon formulaire:

                            <form action="<c:url value="/rechercheRapide"/>" id="search-form" method="post"><fieldset>
                                                                    	<div class="styled-select">
                                                                           <select name="type_offre" >
                                                                              <option value="select">Sélectionnez le type d'offre</option>
                                                                              <option value="emploi">Emploi</option>
                                                                              <option value="stage">Stage</option>                                                  
                                                                           </select>
                                                                        </div>
                                                                            <div class="styled-select">
                                                                           <select name="ville" id="region" onchange="changerVille()">
                                                                              <option value="select">Sélectionnez une ville</option>
                                                                              <option value="ville1">ville1</option>
                                                                              <option value="ville2">ville2</option>
                                                                              <option value="ville3">ville3</option>
                                                                           </select>
                                                                        </div>
                                                                        <div class="styled-select">
                                                                           <select name="region" id="ville">
                                                                              <option value="select">Sélectionnez une région</option>
                                                                              <option  value="region1">region1</option>
                                                                              <option  value="region2">region2</option>
                                                                              <option  value="region3">region3</option>
                                                                           </select>
                                                                        </div>
                                                                        <div class="styled-select">
                                                                           <select name="secteur">
                                                                              <option value="select">Sélectionnez un secteur</option>
                                                                              <option value="Comptabilité">Comptabilité</option>
                                                                              <option value="Finance">Finance</option>
                                                                              <option value="Informatique">Informatique</option>
                                                                           </select>
                                                                        </div>
                                                                        <a href="#" class="link-2" onclick="document.getElementById('search-form').submit()"><em><b>Rechercher</b></em></a><a href="#" class="fright txt3"><strong>Recherche avancée</strong></a>
                                                                    </fieldset></form>

                            Lorsque je clique sur le bouton rechercher, j'ai le message d'erreur suivant:

                            janv. 14, 2015 11:31:03 PM org.apache.catalina.core.StandardWrapperValve invoke
                            Grave: "Servlet.service()" pour la servlet RechercheRapide a généré une exception
                            dao.DAOException: java.sql.SQLException: No value specified for parameter 2
                            	at dao.OffreDaoImpl.rechercheRapide(OffreDaoImpl.java:167)
                            	at servlets.RechercheRapide.doPost(RechercheRapide.java:62)
                            	at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
                            	at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
                            	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
                            	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
                            	at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
                            	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
                            	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
                            	at filters.PrechargementFilter.doFilter(PrechargementFilter.java:66)
                            	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
                            	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
                            	at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
                            	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
                            	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
                            	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
                            	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
                            	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
                            	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
                            	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
                            	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
                            	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
                            	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
                            	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
                            	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
                            	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
                            	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
                            	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
                            	at java.lang.Thread.run(Thread.java:744)
                            Caused by: java.sql.SQLException: No value specified for parameter 2
                            	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
                            	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
                            	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
                            	at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2176)
                            	at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2100)
                            	at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1826)
                            	at com.jolbox.bonecp.PreparedStatementHandle.executeQuery(PreparedStatementHandle.java:172)
                            	at dao.OffreDaoImpl.rechercheRapide(OffreDaoImpl.java:162)
                            	... 28 more
                            
                            

                            Pourtant voici ce que m'affiche la console:

                            la vraie requete est: select * from Offre where type_offre = ? and ville = ? and region = ? and secteur = ?
                            
                            la requete pour les parametres est: typeOffre,ville,region,secteur


                            Une idée?

                            • Partager sur Facebook
                            • Partager sur Twitter
                              15 janvier 2015 à 10:28:34

                              Tu as quoi dans la méthode initialisationRequetePreparee?
                              • Partager sur Facebook
                              • Partager sur Twitter
                                16 janvier 2015 à 21:44:35

                                Voici:

                                 public static PreparedStatement initialisationRequetePreparee( Connection connexion, String sql, boolean returnGeneratedKeys, Object... objets ) throws SQLException {
                                        PreparedStatement preparedStatement = connexion.prepareStatement( sql, returnGeneratedKeys ? Statement.RETURN_GENERATED_KEYS : Statement.NO_GENERATED_KEYS );
                                        for ( int i = 0; i < objets.length; i++ ) {
                                            preparedStatement.setObject( i + 1, objets[i] );
                                        }
                                        return preparedStatement;
                                    }



                                • Partager sur Facebook
                                • Partager sur Twitter

                                Gérer requete SQL avec critères variables en J2EE

                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                • Editeur
                                • Markdown