2. Un premier exemple

2.1. Écriture d'une première requête

Commençons par écrire une première requête JPQL, qui cherche les marins dont le nom est Surcouf.

Exemple 29. Une première requête JPQL

select marin from Marin marin where marin.nom =  'Surcouf'
Cette requête ressemble grandement à du SQL, notons tout de même les différences suivantes :
  • En SQL on sélectionne une liste de colonnes appartenant à une ou plusieurs tables. En JPQL on sélectionne une entité. L'entité que l'on sélectionne, ici Marin, est désignée par son nom. Rappelons que le nom d'une entité est donné par l'attribut name de l'annotation @Entity. S'il n'est pas précisé, alors le nom par défaut de l'entité est le nom complet de la classe.
  • En SQL, la clause where exprime des contraintes sur les colonnes d'une des tables qui est interrogée par la requête. En JPQL elle s'exprime sur les champs de l'entité sur laquelle la sélection a lieu. L'entité Marin doit donc ici posséder un champ nom. Il est possible de naviguer au travers du graphe d'objets, par exemple marin.adresse.rue est une écriture légale en JPQL.
  • Notons tout de suite qu'il est possible de sélectionner une entité en relation d'une autre. Par exemple select marin.adresse from Marin marin ... retournera une liste d'objets adresse.

2.2. Exécution d'une première requête

L'exécution d'une requête passe par la création d'un objet de type Query à partir de l' entity manager .

Exemple 30. Exécution d'une première requête

// Construction d'un entity manager
EntityManager em = ... ;

 // construction d'un objet Query	
Query query = em.createQuery(
    "select marin from Marin marin where marin.nom = 'Surcouf'") ;

 // exécution et récupération de la liste résultat
List<Marin> marins = query.getResultList() ;

 // analyse du résultat (classique)
 for (Marin marin : marins) {
    System.out.println(marin.getNom()) ;
}

Exécuter une requête JPQL se fait donc en deux temps :
  • Définition de l'objet requête proprement dit, de type Query.
  • Puis exécution de la requête, et lecture du résultat.
Notons que Query possède également deux autres méthodes :
  • getSingleResult() : retourne l'unique objet résultat de cette requête. Si la requête retourne plusieurs objets, alors une exception de type NonUniqueResultException est générée.
  • getFirstResult() : retourne le premier objet résultat de cette requête. Si la requête ne retourne aucun objet, alors cette méthode renvoie null.

2.3. Exécution d'une première requête d'agrégation

De même que le SQL, le JPQL définit la notion d'agrégation. La syntaxe est analogue au SQL. Voyons un exemple qui permet d'obtenir le nom de marins dont le nom commence par un 's'.

Exemple 31. Une première requête d'agrégation

// construction d'un objet Query	
Query query = em.createQuery(
    "select count(marin) from Marin marin where marin.nom like 'S%'") ;

 // exécution et récupération du résultat
 int nombre = (Integer)query.getSingleResult() ;

Dans ce cas on peut utiliser sans crainte la méthode getSingleResult().
JPA & EJB
Retour au blog Java le soir
Cours & Tutoriaux
Table des matières
Introduction
1. Objet du mapping objet / relationnel
2. Un peu d'histoire
Un premier exemple
1. Introduction
2. Création de l'environnement technique
2.1. Introduction
2.2. Création de la base Derby
2.3. Création du projet NetBeans et d'une première entité
2.4. Structure d'un projet persistant
2.5. Une première classe persistante
2.6. Un premier fichier persistence.xml
3. Utilisation de ce premier exemple
3.1. Écriture du code d'utilisation
3.2. Exécution de notre premier exemple
3.3. Modification de la class Marin
3.4. Opérations CRUD
Mettre un jeu de classes en base
1. Introduction
2. Définition d'une entité JPA
2.1. Écriture de l'entité
2.2. Annotation de l'entité
2.3. Annotations des champs
2.4. Exemple d'utilisation
3. Opérations sur les entités
3.1. Introduction
3.2. Opération PERSIST
3.3. Opération REMOVE
3.4. Opération REFRESH
3.5. Opération DETACH
3.6. Opération MERGE
4. Mise en relation d'entités
4.1. Introduction
4.2. Relations unidirectionnelles et bidirectionnelles
4.3. Relation 1:1
4.4. Relation 1:p
4.5. Relation p:1
4.6. Relation n:p
4.7. Comportement cascade
4.8. Effacement des entités orphelines
5. Charger des entités et leurs relations
6. Objets inclus
6.1. Introduction
6.2. Déclaration d'un objet inclus
6.3. Utilisation d'objets inclus
6.4. Cas où l'objet inclus est nul
6.5. Renommer les colonnes incluses
6.6. Collections d'objets inclus
L'API Collection en base
1. Introduction
2. Enregistrer une collection d'entités
2.1. Enregistrement d'une collection simple
2.2. Enregistrement d'un Set
2.3. Enregistrement d'une List
3. Enregistrer une collection de types de base
4. Enregistrement d'une Map
4.1. Table de hachage de type (type de base, entité)
4.2. Cas où la clé est un champ de la valeur
4.3. Cas d'une table (entité, entité)
Héritage
1. Introduction
2. Enregistrement d'une hiérarchie de classes
2.1. Entité et super-classe non enregistrée
2.2. Position du problème
2.3. Trois façons de faire
3. Stratégie SINGLE_TABLE
3.1. Fonctionnement
3.2. Mise en place
3.3. Limitations
4. Stratégie JOINED
4.1. Fonctionnement
4.2. Mise en place
4.3. Limitations
5. Stratégie TABLE_PER_CLASS
5.1. Fonctionnement
5.2. Mise en place
5.3. Limitations
Requêtes
1. Introduction
2. Un premier exemple
2.1. Écriture d'une première requête
2.2. Exécution d'une première requête
2.3. Exécution d'une première requête d'agrégation
3. Définition de requêtes
3.1. Requêtes dynamiques
3.2. Requêtes paramétrées
3.3. Requêtes nommées
3.4. Requêtes natives
4. Exécution, analyse du résultat
4.1. Exécution d'une requête dynamique
4.2. Exécution d'une requête nommée
4.3. Analyse du résultat
4.4. Cas des résultats de grande taille
4.5. Remarques
5. Clause From
5.1. Définition des entités
5.2. Jointures dans la clause From
5.3. Remarque finale sur les jointures en JPQL
6. Clause Where
6.1. Variables et chemins dans une clause where
6.2. Expressions conditionnelles et opérateurs
6.3. Requêtes imbriquées
6.4. Opérateurs any, all et some
6.5. Expressions fonctionnelles
7. Clauses Group By et Having
8. Opérations Update et Delete
EJB
1. Introduction
2. Un premier exemple
2.1. Introduction
2.2. Installation dans Glassfish à l'aide de Netbeans
2.3. Création d'un premier EJB
2.4. Déploiement de notre premier EJB
2.5. Création d'un client
3. Mise en oeuvre du pattern session facade
3.1. Introduction
3.2. Modèle objet
3.3. Définition de l'unité de persistance
3.4. Assemblage de notre application
3.5. Assemblage et déploiement
3.6. Utilisation du client
4. Opération de persistance en façade
4.1. Introduction
4.2. Enrichissement du service
4.3. Création de la méthode findMarinById(long)
4.4. Ajout de la méthode findAllMarins()
4.5. Utilisation dans un code client
5. Types d'EJB
5.1. Introduction
5.2. Qu'est-ce qu'un EJB ?
5.3. Écriture d'un EJB session
5.4. Qu'est-ce qu'une méthode métier ?
5.5. EJB avec ou sans état
5.6. Gestion des transactions
5.7. Restrictions
6. Cycle de vie d'un EJB
6.1. Cas des EJB sans état
6.2. Cas des EJB avec état
6.3. Injection de dépendances
7. Transaction gérée par l'EJB
7.1. Introduction
7.2. Déclaration du mode transactionnel
7.3. Gestion de la transaction
7.4. Fonctionnement de la transaction
7.5. Cas des EJB avec état
8. Transaction gérée par le serveur
8.1. Introduction
8.2. Déclaration du mode transactionnel
8.3. Gestion de la transaction
8.4. Fonctionnement de la transaction
8.5. Remarques
9. Intercepteurs
9.1. Introduction
9.2. Aperçu général
9.3. Cycle de vie d'un intercepteur
9.4. Object InvocationContext
9.5. Interception d'un EJB ou d'une méthode métier
9.6. Exemple de mise en œuvre d'un intercepteur