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

Développement Web en Java Discussion :

recuperation champs date d une requete


Sujet :

Développement Web en Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 36
    Par défaut recuperation champs date d une requete
    Salut!

    j ai un petit souci dans mon projet de réservation de chambre d’hôtel.
    j essaye de récupérer les champs date d une requete pour les mettre dans une méthode qui doit me trouver les chambre
    dispos a cette date
    voici ma méthode


    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
    public Collection<Chambre> getChambreLibre(Date dateDebut, Date dateFin) {
     
            List<Chambre> lc = new ArrayList<>();
            String req = "select c from Chambre c  join c.reservation on chambre.numChambre=reservation.chambreNumChambre"
                    + "and '" + dateDebut + "' BETWEEN reservation.dateDebut AND reservation.dateFin"
                    + "OR '" + dateFin + "'BETWEEN reservation.dateDebut AND reservation.dateFin"
                    + "OR reservation.dateDebut BETWEEN '" + dateDebut + "' AND '" + dateFin + "'"
                    + "OR reservation.dateFin BEETWEEN '" + dateDebut + "'AND '" + dateFin + "'"
                    + "WHERE reservation.numChambre IS NULL ";
            Query qr = em.createNamedQuery(req);
            lc = qr.getResultList();
            return lc;
     
    seulement dans mon controleur je suis embété quand j essaye de recuperer ces dates dans a travers la methode du bean
     if (session.getAttribute("ch") == null) {
                session.setAttribute("ch", beanReservation.getChambreLibre(null,null));

    mon probleme c 'est comment recuperer les valeurs des dates de la requete pour les mettres a la place des champs null, null

    J'ai bien essayé beanReservation.getChambreLibre(request.getParameter"dateDebut"..."dateFin")
    le probleme c est que ma methode attend des dates pas un string!!!!
    y a t il un petit genie dans les parrages?

  2. #2
    Membre chevronné Avatar de freddou17
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2013
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 341
    Par défaut
    Slt,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
    String dateToString= "dd/mm/aaaa";
    Date date = formatter.parse(dateToString);
    bon courage
    ++

  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
    Ce n'est pas une requête JPA conforme, tu devrais avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String req = "select c from Chambre c  join c.reservation r WHERE r.numChambre IS NULL ";
    Query qr = em.createQuery(req);
    Ensuite, pour les tests, ce serait quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ...
    req += " and r.dateDebut <= :dateDebut and r.dateFin >= :dateFin";
    Query qr = em.createQuery(req);
    qr.setParameter("dateDebut", leParametreDateDebut); <--- Objet Date
    qr.setParameter("dateFin", leParametreDateFin);
     
    List<Chambre> list = qr.getResultList();
    ...
    Une bonne habitude à prendre : ne pas injecter les valeurs passées en paramètre dans une requête SQL, tu risques l'injection de dépendance avec des paramètres String...
    Sans JPA, utiliser un PreparedStatement plutôt qu'un Statement
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 36
    Par défaut
    salut OButterlin
    merci de a réponse mais j ai vraiment du mal avec le jpql et ta requete en 2 parties ne m'éclaire pas plus
    en fait le but de cette requete serait de recuperer les chambres libres a une date donnée donc , il faudrait que la requete prenne en compte les intervalles de réservation
    ex: si une chambre est réserveé du 25 au 29 qu un client qui veut reserver la meme chambre du 24 au 30 puisse le faire
    car les dates de debut et de fin sont differents sauf que dans l intervalle la chambre est réservée!
    Bon je pense que t'as compris ce que je voulais faire mais simplement ta requete me laisse perplexe!
    peut tu mieux me l expliquer et pourquoi est elle en 2 parties?

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par kcirtap.tim Voir le message
    salut OButterlin
    merci de a réponse mais j ai vraiment du mal avec le jpql et ta requete en 2 parties ne m'éclaire pas plus
    En gros, jamais de "+ uneVariable" dans une requête SQL ou JPQL, toujours utiliser des paramètres. J'en profite pour corriger tes espaces manquant entre tes +, par utiliser la bonne méthode (createQuery pas createNamedQuery) et par écrire correctement le join (pas de join...on en jpql, le on est calculé à partir de la structure de l'entity bean)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public Collection<Chambre> getChambreLibre(Date dateDebut, Date dateFin) {
     
            String req = "select c from Chambre c  join c.reservation reservation "
                    + "where (:debut BETWEEN reservation.dateDebut AND reservation.dateFin "
                           + "OR :fin 'BETWEEN reservation.dateDebut AND reservation.dateFin "
                           + "OR reservation.dateDebut BETWEEN :debut and :fin "
                           + "OR reservation.dateFin BEETWEEN :debut and :fin) "
                    + "AND reservation.numChambre IS NULL ";
            Query qr = em.createQuery(req);
            return em.createQuery(req)
                    .setParameter("debut",dateDebut)
                    .setParameter("fin",dateFin)
                    .getResultList();
    A noter aussi que ton test est supercompliqué pour faire un truc simple qui me semble donner le même résultat, a supposer que ta table est saine (debut<=fin) et que dateDebut <= dateFin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public Collection<Chambre> getChambreLibre(Date dateDebut, Date dateFin) {
     
            String req = "select c from Chambre c  join c.reservation reservation "
                    + "WHERE :debut <= reservation.dateFin "
                    + "AND :fin >= reservation.dateDebut "
                    + "AND reservation.numChambre IS NULL ";
            Query qr = em.createQuery(req);
            return em.createQuery(req)
                    .setParameter("debut",dateDebut)
                    .setParameter("fin",dateFin)
                    .getResultList();
    C'est pas plus lisible?

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 36
    Par défaut
    J'ai bien testé ton code. Le problème est que ca n'a pas fonctionné. J'ai eu plein d'erreurs :
    JPQL: The state field path cannot be resolved to a valid type!

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 36
    Par défaut
    salut !
    j ai tésté tes codes jpql les 2 me renvoient des exceptions du style

    61, 281] The expression is not a valid conditional expression.
    [281, 318] The query contains a malformed ending.]]
    j 'ai bien essayé de régler ca mais aucun resultat

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 36
    Par défaut
    salut freddou17

    je comprends bien qu'il faut formater la date dans la classe...sauf que pour recuperer le champs du request.getParameter()
    ne vaut il pas mieux d'abord que je declare ma methode des strings en argument de ma methode?
    quitte a formater ce string en date dans ma classe par la suite?

  9. #9
    Membre chevronné Avatar de freddou17
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2013
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2013
    Messages : 341
    Par défaut
    Pourquoi ne pas faire le parse dans ton controler? tu peux aussi le faire dans ta classe... à toi de voir


    Pour la requête OButterlin t'as décrit la bonne méthode avec le bind de paramètres

    :dateFin = normalisation du paramètre (il pourrait s'appeler :toto) qui va se voir attribuer une valeur par la mth
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    qr.setParameter("dateDebut", leParametreDateDebut);
    //ou si on avait mis :toto
    qr.setParameter("toto", leParametreDateDebut);
    si tu ne vois toujours pas recherche sur le net le binding de parametres...

    bon courage
    ++

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 36
    Par défaut
    Salut,

    J'ai bien formaté la date dans ma méthode mais j'ai une exception
    Grave: java.text.ParseException: Unparseable date: "dd/mm/aaaa"
    Voici mon code :
    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
     
    @Override
        public Collection<Chambre> getChambreLibre(String dateDebut, String dateFin) {
            try {
     
                List<Chambre> lc = new ArrayList();
                //String req = "select c from Chambre c join c.reservation reservation where: debut<=reservation.dateFin and :fin >=reservation.dateFin AND reservation.numchambre is null";
                String req="select c from Chambre c join c.reservation r where c.numChambre is null and r.dateDebut<=:dateDebut and r.dateFin>=:dateFin";
                Query qr = em.createQuery(req);
                SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy",Locale.FRANCE);
                dateDebut = "dd/mm/aaaa";
                dateFin = "dd/mm/aaaa";
                Date debut = formatter.parse(dateDebut);
                Date fin = formatter.parse(dateFin);
     
                qr.setParameter("dateDebut", debut);
                qr.setParameter("dateFin", fin);
                lc = qr.getResultList();
                return lc;
            } catch (NoSuchEJBException ff) {
     
                return null;
     
            } catch (ParseException ex) {
                Logger.getLogger(BeanReservation.class.getName()).log(Level.SEVERE, null, ex);
            }
            return null;
     
        }
    }
    merci

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

Discussions similaires

  1. Recuperer les nom des champs SELECT dans une requete
    Par guigui69 dans le forum VBScript
    Réponses: 1
    Dernier message: 28/04/2014, 18h11
  2. [MySQL]pb de récupération de dates dans une requête SQL
    Par MisterGé dans le forum Langage SQL
    Réponses: 2
    Dernier message: 30/07/2007, 13h51
  3. Réponses: 7
    Dernier message: 11/03/2007, 22h49
  4. [SQL] Conditions sur une date dans une requete
    Par poufouille dans le forum Bases de données
    Réponses: 4
    Dernier message: 17/03/2004, 14h25
  5. test la valeur d'une date dans une requete
    Par TuxP dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/01/2004, 14h53

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