Précédent   Forum des professionnels en informatique > Java > Général Java > Persistance > JPA
JPA Forum d'entraide sur l'API de persistance JPA (Java Persistence API)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/01/2012, 22h52   #1
Membre habitué
 
Avatar de geforce
 
Femme
Développeur informatique
Inscription : janvier 2010
Messages : 468
Détails du profil
Informations personnelles :
Sexe : Femme

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2010
Messages : 468
Points : 149
Points : 149
Envoyer un message via Skype™ à geforce
Par défaut Requête Criteria ou JPQL

Bonjour,

Voici un bout de mon code :
Code :
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) ?
geforce est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 17h30   #2
Nouveau Membre du Club
 
Inscription : décembre 2003
Messages : 77
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 77
Points : 39
Points : 39
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 :
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 :
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 :
CriteriaQuery<Object> select = criteriaQuery.select(from);
Cette instruction n'est pas nécessaire parce que tu n'as qu'un seul root.
piemur2000 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/01/2012, 15h53   #3
Membre habitué
 
Avatar de geforce
 
Femme
Développeur informatique
Inscription : janvier 2010
Messages : 468
Détails du profil
Informations personnelles :
Sexe : Femme

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2010
Messages : 468
Points : 149
Points : 149
Envoyer un message via Skype™ à geforce
Ok, merci très bonne solution
Code :
 select.orderBy(criteriaBuilder.asc(from.get( Pays_.libelle.getName() )));
Cordialement
Geforce
geforce est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h48.


 
 
 
 
Partenaires

Hébergement Web