49
pages
Français
Documents
Le téléchargement nécessite un accès à la bibliothèque YouScribe Tout savoir sur nos offres
49
pages
Français
Documents
Le téléchargement nécessite un accès à la bibliothèque YouScribe Tout savoir sur nos offres
‰
‰
‰
‰
‰
‰
‰
‰
‰
‰
‰
‰
‰
‰
‰
‰
‰
‰
‰
‰
Plan de la partie 2 (1/2)
Récupérer des données de la baseJPA 2.0
Langage d’interrogation JPQL
(Java Persistence API) API « Critère »
Modifications en volume-Partie 2
Exceptions
TransactionUniversité de Nice - Sophia Antipolis
ConcurrenceVersion 2.15 – 1/2/12
Richard Grin Entités détachées
Configuration d’une unité de persistance
R. Grin JPA page 2
Plan de la partie 2 (2/2)
Fichiers de configuration XML
JPA et DAOs
Cache des données Récupérer des données
Optimisation de la base de données
Méthodes callbacks et écouteurs
Validation
Adaptation à une base de données préexistante
Précisions pour la génération du schéma de la
base de données
R. Grin JPA page 3 R. Grin JPA page 4
Rappel important
Toutes les entités retrouvées par find,
Cette section montre comment interroger la getReference ou un query sont
base de données pour récupérer des entités automatiquement gérées par le gestionnaire
(des employés par exemple) ou des simples d’entités
valeurs (des noms d’employés ou le total des
Les modifications apportées à ces entités sont
salaires des employés par exemple)
donc enregistrées au prochain commit (mais
les nouveaux objets associés à l’entité
retrouvée ne sont pas automatiquement
persistants même s'il y a une cascade sur
persist ; ça ne marche que pour un appel
explicite de la méthode persist)
R. Grin JPA page 5 R. Grin JPA page 6
1‰
‰
‰
‰
‰
‰
‰
‰
‰
‰
ExempleChercher par identité
find et getReference (de EntityManager) Departement dept =
em.find(Departement.class, 10);permettent de retrouver une entité en donnant
son identificateur dans la BD
<T> T find(Class<T> classeEntité,
Object cléPrimaire)
<T> T
getReference(Class<T> classeEntité,
Object cléPrimaire)
Le résultat est null si aucune entité n’a cet
identificateur dans la base de donnée
R. Grin JPA page 7 R. Grin JPA page 8
getReference getReference
getReference renvoie une référence vers une getReference peut être (rarement) utilisée
entité, sans que cette entité ne soit pour améliorer les performances quand une
nécessairement initialisée entité non initialisée peut être suffisante, sans
que l’entité entière soit retrouvée dans la base Le plus souvent il vaut mieux utiliser find
de données
Par exemple, pour indiquer une association dont
le but est unique (OneToOne ou ManyToOne) :
Departement dept =
em.getReference(Departement.class, 10);
Employe emp.setDepartement(dept);
R. Grin JPA page 9 R. Grin JPA page 10
Interroger la base de données Étapes pour récupérer des données
Il est possible de rechercher des données sur 1. Décrire ce qui est recherché (langage JPQL
des critères plus complexes que la simple ou criteria API)
identité 2. Créer une instance de type Query
Remarque : dans toute la partie à venir sur 3. Initialiser la requête (paramètres, pagination)
les requêtes (query, JPQL, API criteria),
4. Lancer l’exécution de la requête
« entité » peut désigner une entité ou une
classe (ou instance de) Embeddable ; depuis
JPA 2.0, les classes Embeddable ont les
« mêmes droits » que les classes entités
R. Grin JPA page 11 R. Grin JPA page 12
2‰
‰
‰
‰
‰
‰
‰
‰
‰
‰
‰
Exemple plus complexeExemple
String q = "select e from Employe as e "
String s = "select e from Employe as e";
+ "where e.departement.numero = :numero";
Query query = em.createQuery(s);
Query query = em.createQuery(q);
List<Employe> listeEmployes =
query.setParameter("numero", 10);(List<Employe>)query.getResultList();
query.setMaxResults(30);
for (int i = 0; i < 5; i++) {
query.setFirstResult(30 * i);
List<Employe> listeEmployes =
(List<Employe>)query.getResultList();
... // Affichage page numéro i + 1
}
R. Grin JPA page 13 R. Grin JPA page 14
Description de la requête Requêtes sur les entités « objet »
Les requêtes JPQL ou « criteria » travaillent avec Le langage JPQL (Java Persistence Query
le modèle objet et pas avec le modèle relationnelLanguage) permet de décrire ce que
l’application recherche (voir prochaine section) Les identificateurs désignent les entités et leurs
attributs et pas les tables et leurs colonnesIl ressemble beaucoup à SQL :
select e from Employe e Les seules classes qui peuvent être explicitement
where e.nom = 'Dupond' désignées (par leur nom) dans une requête sont
L’API « Criteria » a été introduite par JPA 2.0 les entités et les classes « Embeddable »
pour décrire la requête d’une façon plus sûre, Rappel : le nom est donné par l’attribut @name de
vérifiée à la compilation (étudiée à la suite de @Entity ou @Embeddable, ou, par défaut, par
JPQL) le nom de la classe
R. Grin JPA page 15 R. Grin JPA page 16
QueryType du résultat
L’expression renvoyée peut être Pour faire exécuter la requête il faut créer un
Query, instance qui représente une requête n une (ou plusieurs) expression « entité »,
par exemple un employé (e par exemple) (étudiée en détails un peu plus loin)
Plusieurs méthodes de EntityManagern une « valeur »,
permettent d’obtenir un Query, suivant la par exemple le nom d’un employé (e.nom),
façon dont la requête a été décritey compris une expression arithmétique
(e.salaire * 1.25)
L’expression ne peut pas être une collection
(d.employes par exemple), bien que certains
fournisseurs de persistance le permettent !
R. Grin JPA page 17 R. Grin JPA page 18
3‰
‰
‰
‰
‰
‰
‰
‰
‰
‰
‰
‰
Méthodes pour obtenir un Query Exécuter une requête (1)
Les méthodes suivantes de EntityManager Plusieurs méthodes de l’interface Query
renvoient un Query ; elles sont liées au permettent d’exécuter une requête et de
langage JPQL, à l’API « criteria », aux requêtes récupérer son résultat
natives SQL et aux requêtes nommées (tout
cela sera étudié dans la suite du cours)
createQuery(String jpql)(CriteriaQuery criteria)
createNativeQuery(String sql)
createNamedQuery(String nom)
R. Grin JPA page 19 R. Grin JPA page 20
Exécuter une requête (2) Exécuter une requête (3)
Si plusieurs valeurs ou entités peuvent être Pour le cas où une seule valeur ou entité est
renvoyées, il faut utiliser la méthode renvoyée, le plus simple est d’utiliser la
getResultList() de l’interface Queryméthode getSingleResult() ; elle renvoie
un Object Elle renvoie une liste « raw » (pas générique)
des résultats, instance de java.util.List, La méthode lance des exceptions s’il n’y a
éventuellement vide si le résultat est videpas exactement une entité qui correspond à
la requête : Un message d’avertissement est affiché
durant la compilation si le résultat est rangé nNoResultException
dans une liste générique (List<Employe>
nNonUniqueResultException
par exemple)
R. Grin JPA page 21 R. Grin JPA page 22
Type d’un élément Exemple 1 : renvoie une entité
du résultat
String s = "select e from Employe as e";
Query query = em.createQuery(s);
Le type d’un élément de la liste (ou de
List<Employe> listeEmployes = l’unique valeur ou entité renvoyée) est
(List<Employe>)query.getResultList();
nObject si la clause select ne comporte
qu’une seule expression
nObject[] si elle comporte plusieurs On peut faire un cast
expressions
R. Grin JPA page 23 R. Grin JPA page 24
4‰
‰
‰
‰
‰
‰
‰
‰
‰
‰
‰
‰
‰
Exemple 2 : renvoie une propriété Exemple 3 : renvoie plusieurs valeurs
String s = texte = "select e.nom, e.salaire "
"select e.nom from Employe as e"; + " from Employe as e";
Query query = em.createQuery(s); query = em.createQuery(texte);
List<String> listeEmployes = List<Object[]> liste =
(List<String>)query.getResultList(); (List<Object[]>)query.getResultList();
for (Object[] info : liste) {
System.out.println(info[0] + " gagne "
On peut faire un cast + info[1]);
}
R. Grin JPA p