Calcul de la somme d'une colonne

Streamooc Messages postés 89 Statut Membre -  
KX Messages postés 19031 Statut Modérateur -
Bonjour à tous.Je désire calculer la somme des factures de la journée.Ce que j'ai écris n'est pas correcte.Comment je fais le type de retour ? La requête également ? J'ai besoin qu'on m'aide à le corriger s'il vous plaît.

@Override
 public double totalJour(Facture facture) {
  
   facture=null;
  try {
   //Préparation de la requête
   String sql="SELECT SUM (factures_montants) AS facturetotale FROM factures WHERE factures_date_limite like ?";
    //Création d'une zone de requête
   PreparedStatement pst=conn.prepareStatement(sql);
   
   //Exécution de la requête
   ResultSet rs=pst.executeQuery();
   //Traitement du résultat de la requête
   while (rs.next()) {
    int id = Integer.parseInt(rs.getString("idfactures"));
    String numerofact = rs.getString("factures_numero");
    String montant = rs.getString("factures_montants");
    Date datelim = rs.getDate("factures_date_limite");
    int idPays = rs.getInt("facturiers_idfacturiers");
    facture=new Facture(id, numerofact, montant,datelim,idPays);
    
   }
  } catch (NumberFormatException e) {
   e.printStackTrace();
  } catch (SQLException e) {
   System.out.println("Problème de requête");
   e.printStackTrace();
  }
  return ;
 }
public class Facture implements Serializable {
 private int idfactures;
 private String factures_numero;
 private String factures_montants;
 private Date factures_date_limite;
 private int facturiers_idfacturiers;
}

CREATE TABLE `factures` (
  `idfactures` int(11) NOT NULL,
  `factures_numero` varchar(45) NOT NULL,
  `factures_montants` varchar(45) DEFAULT NULL,
  `factures_date_limite` date DEFAULT NULL,
  `facturiers_idfacturiers` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.

9 réponses

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    Bonjour,

    Le problème c'est que tu as masqué l'exception, elle s'affiche dans les logs donc il faudrait la lire, mais sans surprise tu auras une SQLException car tu as fait une requête avec un
    ?
    sans faire de
    set
    donc ton paramètre n'a aucune valeur et ta requête est fausse, elle ne peut donc pas renvoyer de résultat.
    0
    1. Streamooc Messages postés 89 Statut Membre
       
      Bonjour KX merci pour la réponse.Voici ce que j'ai fais.J'ai besoin de votre aide.
      @Override
      public double totalJour(Facture facture) {

      facture=null;
      try {

      String sql="SELECT SUM (factures_montants) AS facturetotale FROM factures WHERE factures_date_limite like ?";

      PreparedStatement pst=conn.prepareStatement(sql);

      pst.setString(1, "%" + facture + "%");

      ResultSet rs=pst.executeQuery();

      while (rs.next()) {
      int id = Integer.parseInt(rs.getString("idfactures"));
      String numerofact = rs.getString("factures_numero");
      String montant = rs.getString("factures_montants");
      Date datelim = rs.getDate("factures_date_limite");
      int idPays = rs.getInt("facturiers_idfacturiers");
      facture=new Facture(id, numerofact, montant,datelim,idPays);
      }
      }

      }
      0
    2. KX Messages postés 19031 Statut Modérateur 3 020 > Streamooc Messages postés 89 Statut Membre
       
      Déjà ta requête
      factures_date_limite like ?
      est fausse.
      factures_date_limite
      est de type
      date
      , mais
      like
      ne s'utilise que sur des
      varchar
      , donc le like n'a rien à faire ici.
      Dans ton code tu fais
      pst.setString(1, "%" + facture + "%"); 
      , or c'est une date que l'on attends, pas un String.
      De plus
      facture
      n'est ni une date, ni un String, c'est ton objet Facture !
      Il faudrait plutôt utiliser
      facture.getFactures_date_limite()
      qui lui renverra bien une date...

      Autre problème sur ta requête, tu fais
      SUM (factures_montants)
      alors que
      factures_montants
      est
      un varchar(45)
      ...
      Si tu veux faire une somme il faut que ce soit sur des nombres, la somme de String n'existe pas.

      Remarque : toutes ces erreurs indiquent que tu fais ton code Java avant d'avoir validé ta requête SQL à la main, ce qui est une perte de temps vu que tu codes pour rien une requête fausse !

      PS : le nommage dans ton code Java est incorrect, il ne devrait pas y avoir de
      _
      dans les noms, ni pour les variables, ni pour les méthodes, qui devraient être en camelCase :
      factures_date_limite
      non,
      facturesDateLimite
      oui.
      0
    3. Streamooc Messages postés 89 Statut Membre
       
      Bonjour KX merci de votre aide.Voici ce que je viens de faire.Comment je fais pour retourner la somme?
      @Override
      public double totalJour(Facture facture) {
      Date dateSelectionnee=facture.getFactureDateLimite();
      facture=null;

      try {

      String sql="SELECT SUM (factureMontant) AS facturetotale FROM facture WHERE factureDateLimite='" + dateSelectionnee +"'";

      PreparedStatement pst=conn.prepareStatement(sql);

      //pst.setString(1, "%" + dateSelectionnee + "%");

      ResultSet rs=pst.executeQuery();

      while (rs.next()) {
      int id = Integer.parseInt(rs.getString("idFacture"));
      Long numerofact = rs.getLong("factureNumero");
      double montant = rs.getDouble("factureMontant");
      Date datelim = rs.getDate("factureDateLimite");

      facture=new Facture(id, numerofact, montant, datelim);
      }
      } catch (NumberFormatException e) {

      e.printStackTrace();
      } catch (SQLException e) {

      e.printStackTrace();
      }
      return 0;
      }


      public class Facture implements Serializable {
      private int idFacture;
      private Long factureNumero;
      private double factureMontant;
      private Date factureDateLimite;
      }
      0
    4. KX Messages postés 19031 Statut Modérateur 3 020 > Streamooc Messages postés 89 Statut Membre
       
      Pour faire ta somme il faut que tes montants soient des nombres, il va falloir changer ta structure de base de données car des varchar ne sont pas adaptés pour ce genre de données.

      Remarque : factureDateLimite='" + dateSelectionnee +"' ne va pas fonctionner, car factureDateLimite est une date, pas un varchar et que de toute façon le toString de dateSelectionnee va te donner une valeur du genre "Fri Aug 03 08:50:31 CEST 2018" qui sera incompréhensible par la base de donnée.
      0
    5. Streamooc Messages postés 89 Statut Membre
       
      Bonjour KX.Voici la base de données.
      CREATE TABLE `factures` (
      `idfactures` INT NOT NULL AUTO_INCREMENT,
      `factureNumero` BIGINT NOT NULL,
      `factureMontant` DOUBLE NOT NULL,
      ` factureDateLimite` DATETIME NULL
      }
      Au fait les enregistrements sont déjà faits au préalable dans la base de données.Par exemple on aura ce format de date 2018-08-15 dans la table factures.J"afficherai la colonne factureDateLimite à l'utilisateur pour qu'il sélectionne la date qu'il souhaite.
      Voici le code source.J'ai besoin de votre aide s'il vous plaît:
      @Override
      public double totalJour(Facture facture) {
      Date dateSelectionnee=facture.getFactureDateLimite();
      facture=null;

      try {

      String sql="SELECT SUM (factureMontant) AS facturetotale FROM facture WHERE factureDateLimite='" + dateSelectionnee +"'";

      PreparedStatement pst=conn.prepareStatement(sql);

      //pst.setString(1, "%" + dateSelectionnee + "%");

      ResultSet rs=pst.executeQuery();

      while (rs.next()) {
      int id = Integer.parseInt(rs.getString("idFacture"));
      Long numerofact = rs.getLong("factureNumero");
      double montant = rs.getDouble("factureMontant");
      Date datelim = rs.getDate("factureDateLimite");

      facture=new Facture(id, numerofact, montant, datelim);
      }
      } catch (NumberFormatException e) {

      e.printStackTrace();
      } catch (SQLException e) {

      e.printStackTrace();
      }
      return 0;
      }


      public class Facture implements Serializable {
      private int idFacture;
      private Long factureNumero;
      private double factureMontant;
      private Date factureDateLimite;
      }
      0
  2. Streamooc Messages postés 89 Statut Membre
     
    Bonjour KX.Ma base de données comprend des enregistrements au format année-mois-jour heure-minute-seconde par exemple 2018-08-02 11:59:51.0.Je voudrais calculer la somme seulement entre des intervalles de mois.Lorsque l'utilisateur saisit par exemple 2017-02 et 2019-08 la somme entre ces deux intervalles devra être affichée.Ma requête ne passe pas.Veuillez me la regarder s'il vous plaît:
    public double totalIntervalleMois(String mi, String mf) {
    String sql = "SELECT SUM(montant) FROM operations WHERE date BETWEEN ? AND ?";
    try (PreparedStatement pst = conn.prepareStatement(sql)) {
    pst.setString(1,mi);
    pst.setString(2,mf);
    try (ResultSet rs = pst.executeQuery()) {
    if (!rs.next()) {
    throw new IllegalStateException("Query returns no result: " + sql);
    }
    double sum = rs.getDouble(1);
    if (rs.wasNull()) {
    throw new IllegalStateException("Query returns NULL: " + sql);
    }
    return sum;
    }
    }
    catch (Exception e) {
    throw new IllegalStateException("totalJour fails: " + mi + " " + mf, e);
    }
    }
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      Si la requête ne passe pas, j'imagine qu'il y a une exception, laquelle ?

      Mais bon je pense que le problème c'est qu'il te faut des type DATETIME dans ta base de données, manipuler des pst.setTimestamp avec ton code Java, et donc convertir tes String au préalable...
      0
  3. Streamooc Messages postés 89 Statut Membre
     
    Bonjour KX.
    Au fait si j'utilise Timestamp celà suppose que je veux entrer des données sous le format yyyy-mm-ss hh-mm-ss.J'ai déjà géré ça dans d'autres cas et ça a marché.
    Ce que je veux faire ici:l'utilisateur entre les deux dates sous ce format yyyy-mm et on lui affiche la liste de toutes les opérations correspondantes entre les deux dates par exemple 2017-02 et 2018-09.
    Bien sûr que le champ 'date' dans ma base de données est au format Timestamp: yyyy-mm-ss hh-mm-ss.Voici l'erreur KX et je la trouve normale puisque c'est les deux dates sont saisies dans ce format yyyy-mm:
    GRAVE: "Servlet.service()" pour la servlet sn.mobilebanking.presentation.RechercherOperationDepotMontantEntrantIntervalleMoisControlleur a généré une exception
    java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
    at java.sql.Timestamp.valueOf(Unknown Source)
    at presentation.OperationIntervalleMoisControlleur.doPost(OperationIntervalleMoisControlleur.java:47)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)

    ////////////////////////////
    C'est de ces deux lignes d'où survient l'erreur:
    Timestamp date1=Timestamp.valueOf(request.getParameter("date_debut"));
    Timestamp date2=Timestamp.valueOf(request.getParameter("date_fin"));
    ////////
    <label>Saisissez les deux mois</label>
    <input id=""
    class="footer__email-input form-control form-control--muted"
    name="date_debut" type="text" aria-describedby="footerEmail"
    placeholder="Année-Mois1" >

    <input id=""
    class="footer__email-input form-control form-control--muted"
    name="date_fin" type="text" aria-describedby="footerEmail"
    placeholder="Année-Mois2" >

    //////
    public double totalIntervalleMois(Timestamp mois1, Timestamp mois2) {
    String sql = "SELECT SUM(montant) FROM operations WHERE date BETWEEN ? AND ?";
    try (PreparedStatement pst = conn.prepareStatement(sql)) {
    pst.setTimestamp(1,mois1);
    pst.setTimestamp(2,mois2);
    try (ResultSet rs = pst.executeQuery()) {
    if (!rs.next()) {
    throw new IllegalStateException("Query returns no result: " + sql);
    }
    double sum = rs.getDouble(1);
    if (rs.wasNull()) {
    throw new IllegalStateException("Query returns NULL: " + sql);
    }
    return sum;
    }
    }
    catch (Exception e) {
    throw new IllegalStateException("totalJour fails: " + mois1 + " " + mois2, e);
    }
    }
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      C'est ce que je disais, il faut convertir tes String au préalable.
      Tu as le format
      yyyy-mm-ss hh-mm-ss
      il faut le convertir en
      yyyy-mm-dd hh:mm:ss
      pour le passer en Timestamp.
      0
  4. Streamooc Messages postés 89 Statut Membre
     
    Bonjour KX. Bien sûr c'est ce format yyyy-mm-dd hh:mm:ss que j'ai
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      Affiches tes deux String request.getParameter("date_debut") et request.getParameter("date_fin") pour voir à quoi il ressemble et pourquoi le valueOf ne fonctionne pas.
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Streamooc Messages postés 89 Statut Membre
     
    Bonjour KX.L'affichage donne les données saisies:
    Date de début:2017-07
    Date de fin:2018-09

    java.lang.IllegalStateException: totalJour fails: 2018-07 2018-09
     at sn.mobilebanking.dao.DaoOperationRetraitImpl.totalOperationRetraitParIntervalleMois(DaoOperationRetraitImpl.java:404)
     at sn.mobilebanking.service.ServiceOperationRetraitImpl.totalOperationRetraitParIntervalleMois(ServiceOperationRetraitImpl.java:68)
     at sn.mobilebanking.presentation.RechercherOperationRetraitMontantSortantIntervalleMoisControlleur.doPost(RechercherOperationRetraitMontantSortantIntervalleMoisControlleur.java:64)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
     at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
     at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962)
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
     at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115)
     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
     at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
     at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
     at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
     at java.lang.Thread.run(Unknown Source)
    Caused by: java.lang.IllegalStateException: Query returns NULL: SELECT SUM(montant_retrait) FROM operation_retrait WHERE operation_retraitdate like ? AND operation_retraitdate like ?
     at sn.mobilebanking.dao.DaoOperationRetraitImpl.totalOperationRetraitParIntervalleMois(DaoOperationRetraitImpl.java:398)

    //Quelque soit la requête que j'utilise rien ne marche:
    public double totalOperationRetraitParIntervalleMois(String moisDebut, String moisFin) {
      String sql = "SELECT SUM(montant_retrait) FROM operation_retrait WHERE operation_retraitdate like ? AND operation_retraitdate like ?";
         try (PreparedStatement pst = conn.prepareStatement(sql)) {
             pst.setString(1,moisDebut);
             pst.setString(2,moisFin);
       
             try (ResultSet rs = pst.executeQuery()) {
                 if (!rs.next()) {
                     throw new IllegalStateException("Query returns no result: " + sql);
                 }
                 double sum = rs.getDouble(1);
                 if (rs.wasNull()) {
                     throw new IllegalStateException("Query returns NULL: " + sql);
                 }
                 return sum;
             }
         }
         catch (Exception e) {
             throw new IllegalStateException("totalJour fails: "  + moisDebut + " " + moisFin, e);
         }
     }

    //doPost
     double total=0;
      
      String date1=request.getParameter("date_debut");
      String date2=request.getParameter("date_fin");
      String action=request.getParameter("action");
    
     total=serv.totalOperationRetraitParIntervalleMois(date1, date2);


    //Vue
      <label>Saisissez les deux mois</label>
                                         <input id=""
               class="footer__email-input form-control form-control--muted"
               name="date_debut" type="text" aria-describedby="footerEmail" 
               placeholder="Année-Mois1" >
         
               <input id=""
               class="footer__email-input form-control form-control--muted"
               name="date_fin" type="text" aria-describedby="footerEmail" 
               placeholder="Année-Mois2" >
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      En SQL si tu fais un
      like
      il faut rajouter un wildcard, par exemple
      like '2018-07-%'
      mais si tu fais
      like '2018-07'
      ça ne trouvera jamais aucun résultat, or le
      SUM
      de rien c'est
      NULL
      , d'où ton erreur "Query returns NULL"

      Mais l'erreur c'est encore et toujours ton format de dates, il faut davantage utiliser les types DATE, TIME, DATETIME ou TIMESTAMP du langage, car tout ne se règle pas avec des VARCHAR...
      0
  7. Streamooc Messages postés 89 Statut Membre
     
    Bonjour KX.J'ai besoin de votre aide s'il vous plaît.Je dois insérrer dans la database des employés avec leurs supérieurs hiérarchiques.Le problème c'est que c'est l'insertion du nom seulement qui passe, la colonne CODE_EMPLOYE_SUP reste à null.Je pense que c'est sûrement au niveau du contrôleur le problème.
    @Entity
    @Table(name="EMPLOYE")
    public class Employe implements Serializable{
     @Id
     @GeneratedValue(strategy=GenerationType.IDENTITY)
     @Column(name="CODE_EMPLOYE")
     private Long codeEmploye;
     private String nomEmploye;
     @ManyToOne
     @JoinColumn(name="CODE_EMPLOYE_SUP")
     private Employe employeSup;
    public Employe(String nomEmploye,  Employe employeSup) {
      super();
      this.nomEmploye = nomEmploye;
      this.employeSup = employeSup;
     }
    public Employe(String nomEmploye) {
      super();
      this.nomEmploye = nomEmploye;
     }
    
    }

    //register.jsp
     <div class="form-group">
                      <label for="exampleInputPassword1">Nom complet</label>
                      <input type="text" class="form-control" name="nom"  id="exampleInputPassword1" placeholder="Nom de l'employe" required="required">
                    </div>
                    <div class="form-group">
           <label for="exampleInputPassword1">Superieur hierarchique</label>
           <select
               class="form-control" name="employeSup">
                   <c:forEach var="emp" items="${listeEmployes}">
                   <option value="${emp.codeEmploye}">${emp.codeEmploye }- ${emp.nomEmploye}</option>
                   </c:forEach>
              </select>
          </div>

    //Controleur
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      String nom = request.getParameter("nom");
            String codeEmplSup=request.getParameter("employeSup");
            Employe employeSuperieur=new Employe(codeEmplSup);
            employeSuperieur.setCodeEmploye(Long.parseLong(codeEmplSup));
            
            Employe employe=new Employe();
            employe.setEmployeSup(employeSuperieur);
           
            DaoImpl d=new DaoImpl();
      
      //Appel au constructeur
          Employe e=new Employe(nom);
    
            d.addEmploye(e, employe.getCodeEmploye());
           
      RequestDispatcher rs = request.getRequestDispatcher("register.jsp");
      rs.forward(request, response);
     }

    //Dao
    public Employe addEmploye(Employe e, Long codeSup) {
      
      try {
          entityManagerFactory=Persistence.createEntityManagerFactory("livrablejpa");
          entityManager=entityManagerFactory.createEntityManager();
          entityTransaction=entityManager.getTransaction();
          entityTransaction.begin();  
      
     
          if (codeSup !=null) {
          Employe sup=entityManager.find(Employe.class, codeSup);
          e.setEmployeSup(sup); 
       }
       entityManager.persist(e);
       entityTransaction.commit(); 
    
      } catch (Exception e1) {
       // TODO Auto-generated catch block
       e1.printStackTrace();
      }
     return e;
           
           
     }
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      Bonjour,

      Tu devrais faire du debug pas à pas (ou relire ton code), tu verrais sûrement le problème...

      "CODE_EMPLOYE_SUP reste à null", mais tu remplis la colonne quand ?

      Tu as ce code :
          if (codeSup !=null) {
            Employe sup=entityManager.find(Employe.class, codeSup);
            e.setEmployeSup(sup); 
         }

      Or que vaut
      codeSup
      ?
      C'est un paramètre de la méthode
      addEmploye(Employe e, Long codeSup)
      que tu appelles ici :
              Employe employe=new Employe();
              employe.setEmployeSup(employeSuperieur);
             
              DaoImpl d=new DaoImpl();
        
        //Appel au constructeur
            Employe e=new Employe(nom);
      
              d.addEmploye(e, employe.getCodeEmploye());

      Quelle est la valeur de
      employe.getCodeEmploye()
      alors que tu n'as jamais fait de
      setCodeEmploye
      ?
      A priori je dirais que ça vaut
      null
      , donc tu ne rentres jamais dans le
      if
      et tu ne fais pas le
      setEmployeSup
      ...
      0
  8. Streamooc Messages postés 89 Statut Membre
     
    Bonjour KX.Merci beaucoup pour la réponse.Je l'ai corrigé en faisant comme vous l'avez dit.Je suis en train de gérer l'authentification et le problème vient de la ligne getSingleResult.J'ai fais de recherches en vain mais pas de solution.J'ai besoin encore de votre aide s'il vous plaît.
    public String authentification(Employe e) {
    // Recuperation de Username et du password issus du bean
    String username=e.getEmailEmploye();
    String password=e.getNomEmploye();
    String resultat="";

    String userNameDB="";
    String passwordDB="";
    String roleDB="";

    try {

    entityManagerFactory=Persistence.createEntityManagerFactory("livrablejpa");
    entityManager=entityManagerFactory.createEntityManager();

    entityTransaction=entityManager.getTransaction();
    entityTransaction.begin();//Ouverture de la transaction

    String jpql="SELECT e FROM Employe e WHERE e.emailEmploye=:param1 AND e.password=:param2 AND e.roleEmploye=:param3";

    TypedQuery<Employe> typedQuery=entityManager.createQuery(jpql,Employe.class);

    typedQuery.setParameter("param1",userNameDB);
    typedQuery.setParameter("param2", passwordDB);
    typedQuery.setParameter("param3",roleDB);

    e=typedQuery.getSingleResult();

    if(username.equals(username)&& password.equals(passwordDB)&& roleDB.equals("Admin")) {
    return "Admin";
    }

    else if (username.equals(userNameDB)&& password.equals(passwordDB)&& roleDB.equals("Gestion")) {
    return "Gestion";

    }
    else
    resultat="Paramètres de connexion incorrects !";

    entityTransaction.commit();

    entityManager.close();
    entityManagerFactory.close();
    } catch (NoResultException ex) {
    System.out.println("Erreur de connexion");
    ex.printStackTrace();
    }
    return resultat;

    }

    22:18:45,641 INFO [stdout] (default task-3) Erreur de connexion
    22:18:45,648 ERROR [stderr] (default task-3) javax.persistence.NoResultException: No entity found for query
    22:18:45,650 ERROR [stderr] (default task-3) at org.hibernate.jpa.internal.QueryImpl.getSingleResult(QueryImpl.java:532)
    22:18:45,651 ERROR [stderr] (default task-3) at sn.objis.livrablejpa.dao.DaoBanqueImpl.authentification(DaoBanqueImpl.java:894)
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      Bonjour,

      C'est une erreur "normale".

      getSingleResult() est une requête "optimiste" qui part du principe qu'elle devrait toujours renvoyer 1 (et 1 seul) résultat et qui va renvoyer NoResultException si elle remonte 0 résultat ou NonUniqueResultException si il y a plus d'1 résultat.

      Voir la documentation :
      https://javaee.github.io/javaee-spec/javadocs/javax/persistence/Query.html#getSingleResult--

      Si tu utilises getSingleResult, il faudrait donc gérer ces différentes exceptions, même si dans ton cas je simplifierai la requête, les conditions sur le mot de passe et le rôle sont en trop puisque de toute façon tu les contrôles déjà après.
      0
  9. Streamooc Messages postés 89 Statut Membre
     
    Merci KX.L'erreur demeure la même en faisant comme vous l'avez dit.
    Et si je commente la ligne de getSingleResult j'aurai NullPointerException.

    String jpql="SELECT e FROM Employe e WHERE e.emailEmploye=:param1";

    TypedQuery<Employe> typedQuery=entityManager.createQuery(jpql,Employe.class);

    typedQuery.setParameter("param1",userNameDB);
    //typedQuery.setParameter("param2", passwordDB);
    //typedQuery.setParameter("param3",roleDB);

    e=typedQuery.getSingleResult();

    if(username.equals(username)&& password.equals(passwordDB)&& roleDB.equals("Employe_Role")) {
    return "Employe_Role";
    }

    else if (username.equals(userNameDB)&& password.equals(passwordDB)&& roleDB.equals("Gestionnaire_Role")) {
    return "Gestionnairer_Role";

    }
    else
    resultat="Vos paramètres de connexion sont incorrects !";

    entityTransaction.commit();

    entityManager.close();
    entityManagerFactory.close();
    } catch (Exception ex) {
    System.out.println("Erreur de connexion");
    ex.printStackTrace();
    }
    return resultat;
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      Tu n'as toujours pas pris en compte les exceptions...

      try {
          e = typedQuery.getSingleResult(); 
      } catch (NoResultException ex) {
          return "NoResultEmploye: " + userNameDB;
      } catch (NonUniqueResultException ex) {
          return "NonUniqueResultEmploye: " + userNameDB;
      }
      0
  10. Streamooc Messages postés 89 Statut Membre
     
    Bonjour merci KX.L'erreur ne s'affiche plus mais le problème c'est que sur ma vue index.jsp ceci s'affiche sur mon navigateur: NoResultEmploye:
    En réalité ce qu'il fait c'est qu'il n'exécute pas les conditions après la ligne de e=typedQuery.getSingleResult();donc il ne va pas au niveau de la base de données pour effectuer la vérification.D'après votre correction,voici le code je suis sûr qu'il y a quelque part oû j'ai mal procédé.

    public String authentification(Employe e) {
    String username=e.getEmailEmploye();
    String password=e.getNomEmploye();
    String resultat="";

    String userNameDB="";
    String passwordDB="";
    String roleDB="";
    e=null;
    try {

    entityManagerFactory=Persistence.createEntityManagerFactory("livrablejpa");
    entityManager=entityManagerFactory.createEntityManager();

    entityTransaction=entityManager.getTransaction();
    entityTransaction.begin();

    //String jpql="SELECT e FROM Employe e WHERE e.emailEmploye=:param1 AND e.password=:param2 AND e.roleEmploye=:param3";

    String jpql="SELECT e FROM Employe e WHERE e.emailEmploye=:param1";

    TypedQuery<Employe> typedQuery=entityManager.createQuery(jpql,Employe.class);

    typedQuery.setParameter("param1",userNameDB);
    //typedQuery.setParameter("param2", passwordDB);
    //typedQuery.setParameter("param3",roleDB);

    try {

    e=typedQuery.getSingleResult();
    if(username.equals(username)&& password.equals(passwordDB)&& roleDB.equals("Employe_Role")) {
    return "Employe_Role";
    }

    else if (username.equals(userNameDB)&& password.equals(passwordDB)&& roleDB.equals("Gestionnaire_Role")) {
    return "Gestionnairer_Role";

    }
    else
    resultat="Vos paramètres de connexion sont incorrects !";

    entityTransaction.commit();

    entityManager.close();
    entityManagerFactory.close();

    } catch (NoResultException ex) {
    return "NoResultEmploye: " + userNameDB;
    }
    catch (NonUniqueResultException ex) {
    return "NonUniqueResultEmploye: " + userNameDB;
    }

    }finally {

    }

    return resultat;

    }

    //Dans le contrôleur c'est le block else seul qui est exécuté
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    String login=request.getParameter("username");
    String motDePasse=request.getParameter("password");

    DaoImpl d=new DaoImpl();

    //Gestion des roles
    Employe loginBean=new Employe();
    loginBean.setEmailEmploye(login);
    loginBean.setPassword(motDePasse);

    String userValidate=d.authentification(loginBean);
    if (userValidate.equals("Employe_Role")) {
    System.out.println("Espace Employe");

    HttpSession session=request.getSession();
    session.setAttribute("Employe", login);
    request.setAttribute("login", login);

    request.getRequestDispatcher("menuEmploye.jsp").forward(request, response);

    } else if (userValidate.equals("Gestionnaire_Role")){
    System.out.println("Espace Gestionnaire");

    HttpSession session=request.getSession();
    session.setAttribute("Gestionnaire", login);
    request.setAttribute("login",login);
    request.getRequestDispatcher("menuGestionnaie.jsp").forward(request, response);

    } else {
    System.out.println("Error message = " + userValidate);
    request.setAttribute("errMessage", userValidate);
    request.getRequestDispatcher("/index.jsp").forward(request, response);
    }

    }

    <form action="/login" method="post">

    <span style="color: red"><%=(request.getAttribute("errMessage")==null)? "": request.getAttribute("errMessage")%></span>
    <div class="form-group has-feedback">
    <input type="text" class="form-control" placeholder="Entrer votre e-mail" name="username">
    <span class="glyphicon glyphicon-envelope form-control-feedback"></span>
    </div>
    <div class="form-group has-feedback">
    <input type="password" class="form-control" placeholder="Mot de passe" name="password">
    <span class="glyphicon glyphicon-lock form-control-feedback"></span>
    </div>
    <div class="row">
    <!-- /.col -->
    <div class="col-xs-4">
    <button type="submit" class="btn btn-primary btn-block btn-flat">Valider</button>
    </div>
    <div class="col-xs-4">
    <button type="reset" class="btn btn-default">Annuler</button>
    </div>
    <!-- /.col -->
    </div>
    </form>
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      Le code renvoie
      "NoResultEmploye: " + userNameDB
      ; donc s'il affiche uniquement
      NoResultEmploye: 
      c'est que userNameDB est vide... C'est pour ça que ta requête ne renvoie aucun résultat, il faut que tu recherches un utilisateur avec une adresse mail qui existe.
      0