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 :
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.
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.
select marin.adresse from Marin marin ...
retournera une liste d'objets
adresse
.
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()) ; }
Query
.
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
.
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() ;
getSingleResult()
.