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 :

Requête Criteria ou JPQL


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de geforce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    1 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 055
    Par défaut Requête Criteria ou JPQL
    Bonjour,

    Voici un bout de 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
     
        public List<Object> findAllGroupByLibelle(String libelle) {
     
            CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
            CriteriaQuery<Object> criteriaQuery = criteriaBuilder.createQuery();
            Root<Pays> from = criteriaQuery.from(Pays.class);
            CriteriaQuery<Object> select = criteriaQuery.select(from);
            select.orderBy(criteriaBuilder.asc(from.get( libelle )));
            TypedQuery<Object> typedQuery = getEntityManager().createQuery(select);
            List<Object> resultList = typedQuery.getResultList();
     
            return resultList;
        }
    Juste une remarque dans mon esprit j'évite d'utiliser du JPQL (ce n'est ni de l'objet nit du SQL) je veux faire dans la continuité (faire de l'objet dans met classe) bref mais dans un but ce lui d'avoir met requête plus maintenable.

    Exemple : si je change le nom d'un champ de ma Table, la requête Object reste valable. (Puisque je n'utilise pas un code brut sous forme de chaine de caractère)

    Mais j'ai fait un test est sa a pas marcher (en pratique ces pas le cas ?! ou ces moi qui a mal fait une chose) ?

  2. #2
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 87
    Par défaut
    Pour que ta query soit vraiment "type safe", c'est à dire que si tu modifie un attribut de ta classe tu ne puisse plus l'utiliser dans une requête, il faut utiliser le metamodel de ta classe.

    Si je reprends ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
            CriteriaQuery<Object> criteriaQuery = criteriaBuilder.createQuery();
            Root<Pays> from = criteriaQuery.from(Pays.class);
            CriteriaQuery<Object> select = criteriaQuery.select(from);
            select.orderBy(criteriaBuilder.asc(from.get( libelle )));
            TypedQuery<Object> typedQuery = getEntityManager().createQuery(select);
            List<Object> resultList = typedQuery.getResultList();
    Tu fais from.get(libelle), libelle étant une string. Admettons que tu veille faire un group by sur le nom du pays, ça revient à faire from.get("name"). Rien ne t'indique si oui ou non "name" appartient à l'entité Pays.

    Si tu utilise le metamodel de Pays (souvent appelé Pays_), tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
            CriteriaQuery<Object> criteriaQuery = criteriaBuilder.createQuery();
            Root<Pays> from = criteriaQuery.from(Pays.class);
            select.orderBy(criteriaBuilder.asc(from.get(Pays_.name)));
            TypedQuery<Object> typedQuery = getEntityManager().createQuery(select);
            List<Object> resultList = typedQuery.getResultList();
    Si l'entité pays change, le metamodel change et donc tu obtiens un erreur en appelant Pays_.name.
    Pour générer le metamodel sous NetBeans avec EclipseLink il faut ajouter la librairie EclipseLink-ModelGen(JPA 2.0).

    PS: Tu remarquera que j'ai enlevé l'instruction suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CriteriaQuery<Object> select = criteriaQuery.select(from);
    Cette instruction n'est pas nécessaire parce que tu n'as qu'un seul root.

  3. #3
    Membre éprouvé
    Avatar de geforce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    1 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 055
    Par défaut
    Ok, merci très bonne solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     select.orderBy(criteriaBuilder.asc(from.get( Pays_.libelle.getName() )));
    Cordialement
    Geforce

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

Discussions similaires

  1. [Criteria] Requête criteria (récupérer l'année d'une date)
    Par langar dans le forum Hibernate
    Réponses: 4
    Dernier message: 14/10/2011, 13h27
  2. Requête Criteria avec jointure
    Par Fatemy dans le forum Hibernate
    Réponses: 0
    Dernier message: 25/08/2011, 00h00
  3. Requête Criteria sur une relation ManyToMany
    Par waldo2188 dans le forum Hibernate
    Réponses: 0
    Dernier message: 04/11/2009, 11h29
  4. Debug + logging de requêtes criteria
    Par piopium dans le forum Hibernate
    Réponses: 1
    Dernier message: 26/09/2009, 13h56
  5. Optimisation d'une requête Criteria
    Par Asterius dans le forum Hibernate
    Réponses: 4
    Dernier message: 25/01/2008, 13h21

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