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

JPA Java Discussion :

Insérer des critères optionnels dans les requêtes HQL


Sujet :

JPA Java

  1. #1
    Membre actif
    Inscrit en
    juin 2005
    Messages
    578
    Détails du profil
    Informations forums :
    Inscription : juin 2005
    Messages : 578
    Points : 240
    Points
    240
    Par défaut Insérer des critères optionnels dans les requêtes HQL
    Bonjour

    J'ai une base de données contenant des informations sur les employés d'une entreprise. Je voudrais afficher la liste des employés en fonction de 3 critères de recherche: nom, prénom, age. J'ai donc mon formulaire qui contient les 3 champs et j'utilise aussi le HQL pour les select sur les tables de la base de données.

    Voici donc comment je récupère la liste des employés en fonction du nom:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     @Query("FROM Employe a WHERE a.nom = :nom")
    	 List<Employe> findEmployeByNom(@Param("nom") String nom);
    Sauf que je dois faire la même chose pour les recherches par prénom, age, nom-prénom, nom-age etc....Bref tous les critères de recherche possibles.

    Donc plus les attributs seront nombreux, plus les requêtes seront nombreuses aussi.

    Y a t il un moyen de gérer ça avec une seule requête?

    Merci

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    janvier 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2009
    Messages : 338
    Points : 701
    Points
    701
    Billets dans le blog
    5
    Par défaut
    Je crains que ta réponse soit non.

    Je te laisse un tutoriel sur ces annotations:
    https://www.baeldung.com/spring-data-jpa-query

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    janvier 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2009
    Messages : 338
    Points : 701
    Points
    701
    Billets dans le blog
    5
    Par défaut
    Pour gérer tout ça, personnellement, j'implémenterais moi-même la méthode, qui prendrait en paramètre un objet qui représente ces paramètres.

    En ce qui me concerne, je ne suis vraiment pas fan du CRUD sauce Spring.

    La raison étant que ça peut toujours mal se passer. Du coup, l'exception doit être spécifié dans le contrat.
    Or, ce n'est pas le cas:
    https://docs.spring.io/spring-data/j...epository.html

    Surtout que des fois, c'est l'utilisateur qui envoie des conneries, et il faut l'envoyer chier, via une exception.

    Spring le fera, mais c'est caché car Spring enverra une RuntimeException.

    Or, selon Joshua Bloch ( https://www.amazon.fr/Effective-Java...t=Joshua+Bloch ), les Runtimes Exception sont pour les erreurs de programmations (NullPointerException,...) là où les exceptions normales sont pour les erreurs utilisateurs ou les problèmes de externes (comme lors d'un problème réseau par exemple).

    Mais effectivement, là, on a 2 visions sur les exceptions.
    Celle de Spring et la mienne/Joshua Bloch.

  4. #4
    Membre actif
    Inscrit en
    juin 2005
    Messages
    578
    Détails du profil
    Informations forums :
    Inscription : juin 2005
    Messages : 578
    Points : 240
    Points
    240
    Par défaut
    Citation Envoyé par PhilippeGibault Voir le message
    Pour gérer tout ça, personnellement, j'implémenterais moi-même la méthode, qui prendrait en paramètre un objet qui représente ces paramètres.
    Peux-tu me donner un exemple de la façon dont tu l’implémenterais?

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    janvier 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2009
    Messages : 338
    Points : 701
    Points
    701
    Billets dans le blog
    5
    Par défaut
    Là, j'ai pas d'exemple sous la main.

    Mais la méthode serait du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    List<Employe> findEmploye( Parametre parametres);
    On utilise le StringBuilder, par exemple:
    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 DISTINCT e from Employe e WHERE ");
    boolean isFirst = true;
    if(parametres.getNom() != null){
      sb.append(e.nom = :nom);
      isFirst = false;
    } 
     
    if(parametres.getAge() != null){
     
        if(!isFirst){
             sb.append(" and ");
        }
        sb.append(" e.age = :age");
       isFirst = false;
    }
    ....
    Après, il suffit d'avoir un traitement JPQL, en utilisant l'EntityManager ( https://www.labri.fr/perso/rgiot/cours/jee/jpa/JPQL.pdf ).

    Avec Spring:
    https://www.baeldung.com/spring-dao-jpa
    https://www.baeldung.com/the-persist...spring-and-jpa

    Notez qu'il est possible, avec EntityManager, de passer par les critéria également:
    https://www.objectdb.com/java/jpa/query/criteria

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    novembre 2006
    Messages
    7 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : novembre 2006
    Messages : 7 278
    Points : 9 477
    Points
    9 477
    Billets dans le blog
    1
    Par défaut
    Petite astuce quand on ne veut pas avoir à se poser la question si on besoin d'un "where" ou d'un "and" dans la relation du filtre, on peut utiliser cette forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select a from MonEntity a where 1 = 1
    Comme ceci, on a plus que des "and" derrière et ça ne pénalise pas les performances
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/06/2010, 15h09
  2. [MySQL] Insérer des simples quotes dans ma requête
    Par Rick62 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 03/06/2009, 15h32
  3. Réponses: 2
    Dernier message: 01/12/2008, 12h00
  4. Insérer des champs vides dans une requête sql
    Par js8bleu dans le forum Langage SQL
    Réponses: 4
    Dernier message: 19/02/2008, 15h00
  5. [SQL] insérer des variables php dans une requête sql
    Par lili38 dans le forum PHP & Base de données
    Réponses: 28
    Dernier message: 22/06/2007, 16h38

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