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

Hibernate Java Discussion :

requete pour recherche avancée


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 144
    Par défaut requete pour recherche avancée
    Bonjour,

    J'aimerais obtenir des conseilles pour la création d'une requête qui va prendre en compte un nombre de critères variables, c'est à dire une recherche avancé tout ce qu'il y a de plus classique.
    Exemple : je cherche les utilisateurs dont le nom est Toto, l'age entre 10 et 30, etc...
    evidemment je ne suis pas obligé de préciser tous les critères (le choix est laissé à l'appréciation de l'utilisateur)

    J'ai bien pensé faire un StringBuilder.append, et tester la valeur des arguments passé mais je trouve ca un peu porc...

    Quelle est la méthode de gourou a utiliser pour que cela soit souple et simple ?

    merci d'avance

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2006
    Messages : 121
    Par défaut
    Bonjour,

    Une méthode de Gourou, je ne sais pas ^^
    Par contre, si tu passes bien tout tes champs vers ton actions (sous forme de variables ou de listes ou autre), un bon vieux test sur des chaines peut faire l'affaire.

    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
     
        public List findFiltered(String id, String nom, String prenom, String ageMin, String ageMax) throws DataAccessException {
            String req = "from "+User.class.getName() ;
            req = req + " where" ;
            /* Si l'id n'est pas vide */
            if (!(id==null || id.isEmpty())) {
                req = req + " idUser="+id +" and" ;
            }
            /* Si le nom n'est pas vide */
            if (!(nom==null || nom.isEmpty())) {
                req = req + " nomUser like '%"+nom+"%' and" ;
            }
            /* Si le prenom n'est pas vide */
            if (!(prenom==null || prenom.isEmpty())) {
                req = req + " prenomUser like '%"+prenom+"%' and" ;
            }
            /* Si l'age n'est pas vide */
            if (!(ageMin==null || ageMin.isEmpty() || ageMax==null || ageMax.isEmpty())) {
                req = req + " ageUser between '"+ageMin+"' and '"+ageMax+"' and" ;
            }
            req = req.substring(0,req.length()-4) ;
            return super.findQuery(req) ;
        }
    Bon ok, c'est un peu moche^^
    Mais ca marche

    A toi de mettre ensuite une belle méthode Validate dans ton action pour valider les champs.

    Bon courrage.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 144
    Par défaut
    merci pour ta réponse
    je vais me le tenter comme ca alors mais en utilisant un StringBuilder plutot qu'un simple String pour lma mémoire.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Tu peux aussi utiliser l'opérateur ternaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // SANS 
    StringBuilder query = new StringBuilder("from User");
    if ( id!=null ) {
      query.append(" and id=?");
    }
     
    // AVEC
    StringBuilder query = new StringBuuilder("from User")
      .append( id!=null?"and id=?":"" );
     
    Mais n'oublie pas qu'il est préférable d'utiliser le ? et d'ensuite passer les paramètres plutôt que de les ajouter toi même à ta requette.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Par défaut
    Citation Envoyé par Alyx² Voir le message
    Bonjour,

    Une méthode de Gourou, je ne sais pas ^^
    Par contre, si tu passes bien tout tes champs vers ton actions (sous forme de variables ou de listes ou autre), un bon vieux test sur des chaines peut faire l'affaire.

    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
     
        public List findFiltered(String id, String nom, String prenom, String ageMin, String ageMax) throws DataAccessException {
            String req = "from "+User.class.getName() ;
            req = req + " where" ;
            /* Si l'id n'est pas vide */
            if (!(id==null || id.isEmpty())) {
                req = req + " idUser="+id +" and" ;
            }
            /* Si le nom n'est pas vide */
            if (!(nom==null || nom.isEmpty())) {
                req = req + " nomUser like '%"+nom+"%' and" ;
            }
            /* Si le prenom n'est pas vide */
            if (!(prenom==null || prenom.isEmpty())) {
                req = req + " prenomUser like '%"+prenom+"%' and" ;
            }
            /* Si l'age n'est pas vide */
            if (!(ageMin==null || ageMin.isEmpty() || ageMax==null || ageMax.isEmpty())) {
                req = req + " ageUser between '"+ageMin+"' and '"+ageMax+"' and" ;
            }
            req = req.substring(0,req.length()-4) ;
            return super.findQuery(req) ;
        }
    Bon ok, c'est un peu moche^^
    Mais ca marche

    A toi de mettre ensuite une belle méthode Validate dans ton action pour valider les champs.

    Bon courrage.
    C'est même assez moche pour ne surtout pas faire ça. En général la concaténation de paramètres à la main est à éviter pour des raisons de sécurité (SQL injection). Si à la place d'une chaine l'utilisateur saisie de quoi fermer ta requête et en ajoute une autre derrière il peut exécuter du code SQL. Le mieux étant de toujours passer par une construction de requête contenant des paramètres nommés (un nom ou un "?"), puis une fois la requête construite d'initialiser chacun des paramètres avec des méthodes de l'API (setParameter, etc...) qui vont se charger d'éliminer tout risque des paramètres.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 144
    Par défaut
    C'est bon j'ai trouvé une autre solution qui deboite !
    J'utilise l'API criteria d'hibernate, c'est tout ce qu'il y a de plus clair et simple

    je suis trop un noob

    merci pour vos reponses

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2006
    Messages : 121
    Par défaut
    mdrr^^

    Justement j'allais le dire le coup du criteria

    (bien que ma requete me semble bien securisée si la methode validate oblige bien à avoir un id, ageMin et ageMax en Integer.
    Mais c'était juste un exemple )

    Bonne journée.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/02/2008, 15h18
  2. [SQL] créer une requete pour une recherche
    Par boubourse92 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 14/01/2008, 14h25
  3. [MySQL] Recherche de requête pour creation d'un agenda
    Par lelectronique.com dans le forum Langage SQL
    Réponses: 6
    Dernier message: 30/10/2006, 11h12
  4. Problème requete pour moteur de recherche
    Par vincedjs dans le forum Requêtes
    Réponses: 48
    Dernier message: 15/03/2006, 15h47
  5. Requete pour rechercher tous les parents
    Par richard038 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 28/11/2005, 22h37

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