Académique Documents
Professionnel Documents
Culture Documents
HQL - JPQL
1
Langages de requête objet
! Les ORM ajoutent un langage de requête
orienté objet
! le langage sert à exécuter des requêtes sur les
entités persistées en base tout en gardant la
logique du modèle objet
"
! HQL : Hibernate Query Langage
"
! JPQL : Java Persistence Query Langage
! d'autres langages de ce type existent
– EJB-QL, ...
2
Langages de requête objet
! Ces langages sont case sensitive sur le nom
des classes et des propriétés
"
"
! JPQL est très proche de HQL
! XML pour Hibernate natif
! annotations pour JPA
3
Interface Query
! Les requêtes sont représentées par une
instance de Query
! obtenue via la méthode createQuery(String)
sur la session ou l'entityManager
"
! L'exécution de la requête retourne une liste de
résultats ou un résultat unique
! JPA : getResultList() et
getSingleResult()
! HQL : list() et uniqueResult()
! beaucoup d'autres méthodes sont disponibles
– cf. les javadoc JPA et Hibernate
4
Exemples de clause
!from Contact
!renvoie toutes les instances de type Contact
!from Contact as c
de la requête
–as est facultatif
5
Exemples de clause
! select * from Contact as c
!renvoie toutes les instances de Contact
Contact
–sous forme d'une tableau Object[]
6
Exemples de clause
!select new list(c.nom,c.prenom) from
Contact as c
!renvoie les propriétés nom et prenom des instances de
Contact
!sous forme d'une List
!select * from Contact as c where
c.nom='toto'
!renvoie les instances de Contact correspondant à la
clause WHERE
7
Langages de requête objet
! HQL et JPQL permettent :
!les jointures : inner join, left outer join, right outer join
!les fonctions d'agrégation : sum, max, count, avg, ...
8
Exécution des requêtes
! Exemple Hibernate natif
! ici la requête est codée
...!
Query q = session.createQuery("from Contact");!
List<Contact> contacts = q.list();!
for(Contact c : contacts){!
! System.out.println(c.getNom()+" "+c.getPrenom());!
}!
...
9
Exécution des requêtes
! Hibernate natif
! les requêtes peuvent être déclarées dans le fichier
hbm
– dans l'élément <hibernate-mapping>
"
...!
" <query name="personne.getPersonneByEmail">!
! <![CDATA[FROM Personne as p WHERE p.email=:email]]>!
...
la requête nommée est alors utilisée via la méthode
–</query>! paramètre de la
requête
session.getNamesQuery(nomRequete)
10
Exécution des requêtes
! Les requêtes sont créées via l'EntityManager
!
createQuery() pour les requêtes JPQL
!
createNamedQuery() pour les requêtes nommées
"
! définies par les annotations
–@NamedQueries({…})
–@NamedQuery()
"
"
! Les requêtes peuvent comporter des paramètres
11
Exécution des requêtes
! JPA : exemple de requête avec paramètres
"
public List<Video> getVideoParTitre(String titre)!
" {!
! Query query = em.createQuery("from Produit p where p.titre like :titre");!
" !
!
query.setParameter("titre", titre+"%");!
return query.getResultList();!
}!
"
! JPA : les paramètres peuvent aussi être indicés
12
Exécution des requêtes
! JPA : les requêtes nommées
! mise en place par annotation
"
...!
" @NamedQueries({!
@NamedQuery(name="CDAudio.getParArtiste",!
" !
})!
! ! query="from CDAudio cd where cd.artiste = :artiste
! utilisation
...!
public List<CDAudio> getCDAudiosParArtiste(String artiste)!
{!
! Query query = em.createNamedQuery("CDAudio.getParArtiste");!
! query.setParameter("artiste", artiste);!
! return query.getResultList();!
}!
...
13