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

Plateformes (Java EE, Jakarta EE, Spring) et Serveurs Discussion :

Extraire les paramètres et valeur envoyé par le formulaire puis créer la requête à partir de ces paramètres.


Sujet :

Plateformes (Java EE, Jakarta EE, Spring) et Serveurs

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 447
    Par défaut Extraire les paramètres et valeur envoyé par le formulaire puis créer la requête à partir de ces paramètres.
    Bonjour,

    Je suis en train de faire une requête à partir des paramètres et valeurs récupérés à partir d'une méthode de mon contrôlleur.

    Mon problème c'est que les paramètres peuvent changer en fonction de ce que choisie l'utilisateur dans les listes déroulantes. C'est là qu'est mon problème, c'est que je ne vois pas comment je peux faire pour changer les paramètres en fonction du choix de l'utilisateur.

    Je donne un exemple je peu très bien avoir cela :

    {AV1=2021-03-01, CP=2, AV1Bis=2021-03-05}

    comme je peu très bien avoir ceci :

    {BV4=Autre, CV11=Le bon coin, CP=2}

    Comme vous pouvez le constater les paramètres change et donc quand je récupère ces paramètres et valeurs en utlisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @RequestParam Map<String, String> post
    et que je les envoi dans ma méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    appelService.recupererAppelsFiltrer(map, pageable));
    c'est à ce moment là que je bloque car dans ma méthode recupererAppelsFiltrer qui doit appeler une méthode de l'interface appelDao je ne sais pas comment modifier dans appelDao la méthode qui requêtera la base de données.

    C'est à dire que je voudrai faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    @Query(
    value="SELECT * FROM apppel 
    WHERE 
               leNomduParamettre1 = :valeurDuParametre1", 
               leNomduParamettre2 = :valeurDuParametre2", 
               leNomduParamettre3 = :valeurDuParametre3", 
    nativeQuery=true)
    List<Appel> findAppelsFiltrer(
               @Param1("valeurDuParametre1") String valeurDuParametre1, 
               @Param2("valeurDuParametre2") String valeurDuParametre2, 
               @Param3("valeurDuParametre3") String valeurDuParametre3);
    En fait les paramètres leNomDuParamettre1 etc devrai changé en fonction de ce qu'à choisie l'utilisateur.

    Donc dans les exemples cités plus haut je devrai avoir un truc du style pour la 1er :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    @Query(
    value="SELECT * FROM appel  
    WHERE 
               AV1 = :valeurDuParametre1", 
               CP = :valeurDuParametre2", 
               AV1Bis = :valeurDuParametre3", 
    nativeQuery=true)
    List<Appel> findAppelsFiltrer(
               @Param1("valeurDuParametre1") String valeurDuParametre1, 
               @Param2("valeurDuParametre2") String valeurDuParametre2, 
               @Param3("valeurDuParametre3") String valeurDuParametre3);
    Et pour le 2 exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    @Query(
    value="SELECT * FROM apppel  
    WHERE 
               BV4 = :valeurDuParametre1", 
               CV11 = :valeurDuParametre2", 
               CP=2 = :valeurDuParametre3", 
    nativeQuery=true)
    List<Appel> findAppelsFiltrer(
               @Param1("valeurDuParametre1") String valeurDuParametre1, 
               @Param2("valeurDuParametre2") String valeurDuParametre2, 
               @Param3("valeurDuParametre3") String valeurDuParametre3);
    Je voudrai que ce soit toujours la même méthode qui soit utilisé mais que seul les paramètres changes pour que je puisse faire mes requêtes.

    Mais peut-être qu'il y a une autre façon de faire mais comme je débute en java EE spring hibernate là je suis complétement bloqué.

    Si quelqu'un avait une solution.

    Merci par avance.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 447
    Par défaut
    Bonjour,

    Vu que je n'ai pas eu de réponse je suppose que j'ai mal formulé ma question, j'ai trouvé un lien sur stakcoverflow ou la personne cherche à faire comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    private static String BASIC_QUERY = "SELECT * FROM COUNTRY";
    public List<Country> selectCoutry(Long age){
           	String query = BASIC_QUERY;
           	if (age != null){
           		query += " WHERE AGE = ";
           		query += age.toString();
             }
    }
    Et c'est exactement ce que je veux faire, mais la réponse ne convient pas à ce que je veux faire.
    Car comme expliqué plus haut j'ai plusieurs select qui appel d'autre select et au finale mes paramètres peuvent changer en fonction de ce que choisi l'utilisateur.

    Si vous voulez, je voudrais faire comme en Symfony avec les requête DQL comme dans cette exemple ci :
    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
     
    // Exemple Symfony DQL :
    public function findAdResearched(
            string $page, 
            int $resultPerPages,
            int $isPagination,
            ?string $marqueId, 
            ?string $modele, 
            ?string $carburant, 
            ?int $min_year,
            ?int $max_year, 
            ?int $min_kms, 
            ?int $max_kms, 
            ?int $min_price, 
            ?int $max_price
        )
        {
            $qb = $this->createQueryBuilder('a');
            $qb->select('
                a.id,
                a.annee, 
                a.prix, 
                ma.marque, 
                mo.modele, 
                p.emplacement AS photos
            ');
     
            $qb->join('a.marque', 'ma')
               ->join('a.modele', 'mo')
               ->join('a.carburant', 'c')
               ->join('a.photos', 'p')
               ->where('p.estPrincipal = 1');
            if( ! empty($marqueId))
               $qb->andWhere('ma.id = :marqueId')
                  ->setParameter("marqueId", $marqueId);
            if( ! empty($modele))
               $qb->andWhere('mo.modele LIKE :modele')
                  ->setParameter("modele", $modele);
            if( ! empty($carburant))
               $qb->andWhere('c.carburant LIKE :carburant')
                  ->setParameter("carburant", $carburant);
            if( ! (empty($min_year) && empty($max_year)))
               $qb->andWhere('a.annee BETWEEN :min_year AND :max_year')
                  ->setParameter('min_year', $min_year)
                  ->setParameter('max_year', $max_year);
            if( ! (empty($min_price) && empty($max_price)))
                $qb->andWhere('a.prix BETWEEN :min_price AND :max_price')
                ->setParameter("min_price", $min_price)
                ->setParameter("max_price", $max_price);
            if( ! (empty($min_kms) && empty($max_kms)))
               $qb->andWhere('a.kilometrage BETWEEN :min_kms AND :max_kms')
                  ->setParameter("min_kms", $min_kms)
                  ->setParameter("max_kms", $max_kms);
                  $qb->orderBy('a.createdAt', 'DESC');
            if($isPagination){
                $qb->setFirstResult(($page-1) * $resultPerPages);
                $qb->setMaxResults($resultPerPages);
            }
     
            return $qb->getQuery()->getResult();  
        }
    J'ai un fichier AppelDao.java, j'ai aussi un AppelService.java et un AppelServiceImpl.java.

    Je sais qu'il existe des setParameter en Java mais il faut utiliser EntityManager mais je n'arrive pas à le faire fonctionner et je n'arrive pas à trouver de tuto suffisamment explicite et compréhensible pour moi donc si vous pouviez me dire comment on l'installe ou on doit et comment l'instancier dans quel dossier fichier etc ce serai sympa.

    Merci par avance.

  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
    Pas sûr d'avoir compris ton problème, il me semble que tu veux faire des requêtes sql avec des paramètres qui ne sont pas tous présents.
    Du coup, tu ne peux pas utiliser une requête unique.
    Exemple
    Tu veux rechercher des personnes et tu as comme critères de filtre :
    - le nom
    - le prénom
    - la ville
    ton utilisateur n'étant pas obligé (heureusement) de renseigner les 3, il peut choisir de passer le nom et la ville, ou le prénom et la ville, ou le nom et prénom etc...
    Du coup, il faut construire une requête dédiée à la demande.

    Avec HIbernate ou JPA tu as Criteria qui permet de faire ça.
    Ou alors tu construis la requête sous forme d'une chaîne de caractère en fonction des paramètres reçus et tu créés l'objet Query avec.
    Un truc dans ce genre
    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
    StringBuilder sb = new StringBuilder();
    sb.append("select a from Person a where 1=1");
     
    if (nom != null && nom.trim().length() > 0)
    {
       sb.append(" and a.nom = :nom");
    }
    if (prenom != null && prenom.trim().length() > 0)
    {
       sb.append(" and a.prenom = :prenom");
    }
    ...
    Query query = entityManager.createQuery(sb.toString());
     
    if (sb.indexOf(":nom" != -1)
    {
       query.setParameter("nom", nom);
    ...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 447
    Par défaut
    J'arrive un peu tard mais merci pour ta réponse.

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/05/2017, 21h45
  2. Effacer les valeurs envoyées par le formulaire
    Par abj8077 dans le forum Langage
    Réponses: 3
    Dernier message: 16/06/2010, 08h45
  3. Recuperation des valeurs envoyé par PTRACE
    Par dragonfly dans le forum Linux
    Réponses: 8
    Dernier message: 23/01/2006, 17h21
  4. recupere un valeur envoyé par une url
    Par pierrot10 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/12/2005, 05h44
  5. Réponses: 2
    Dernier message: 30/11/2004, 02h36

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