Services Avancés
Services Avancés :
Keywords
JPQL
TP9
© 2024-2025 – ESPRIT – Module ASI II (Spring) – Spring - Keywords JPQL 1
KEYWORDS
• Spring Data JPA va créer le code pour les méthodes que tu souhaites utiliser. Il
suffit de lui indiquer les méthodes à utiliser :
Keyword Sample Equivalent to
Select p from Reservation r where
GreaterThan findByanneeUniversitaireGreaterThan(Date dateAU);
[Link] > :dateAU
LessThan findByanneeUniversitaireLessThan(Date dateAU); TODO in class
findByanneeUniversitaireBetween(Date dFrom, Date
Between TODO in class
dTo);
IsNotNull,
findByNumeroChambreNotNull(); TODO in class
NotNull
IsNull, Null findByDescriptionNull(); TODO in class
Like findByAdresseLike(String add); TODO in class
findByPrenomEtudiantAndNomEtudiat(String p,
Contains TODO in class
String n);
(No keyword) Long count(); TODO in class
© 2024-2025 – ESPRIT – Module ASI II (Spring) – Spring - Keywords JPQL 2
KEYWORDS
• Afficher la liste des chambres qui ont un type donné (double par exemple) .
@Repository
public interface ChambreRepository extends JpaRepository<Chambre, Long>
{
List<Chambre> findAllByTypeChambre(TypeChambre tc);
}
© 2024-2025 – ESPRIT – Module ASI II (Spring) – Spring - Keywords JPQL 3
KEYWORDS
• Afficher la chambre qui a un numéro donné.
@Repository
public interface ChambreRepository extends JpaRepository<Chambre, Long>
{
Chambre findChambreByNumeroChambre(long numC);
}
© 2024-2025 – ESPRIT – Module ASI II (Spring) – Spring - Keywords JPQL 4
JPQL
• JPQL = Jakarta Persistence Query Language
• JPQL peut être considéré comme une version orientée objet de SQL.
• En JPQL, on sélectionne des objets d'une entité (une classe annotée par @Entity)
en utilisant les noms des attributs et le nom de la classe de l’entité en question et
non plus ceux de la table de base de données et ses colonnes.
© 2024-2025 – ESPRIT – Module ASI II (Spring) – Spring - Keywords JPQL 5
JPQL : SELECT
• Ces méthodes permettent de récupérer les entreprises avec une adresse donnée :
• JPQL :
@Query("SELECT e FROM Entreprise e WHERE [Link] =:adresse")
List<Entreprise> retrieveEntreprisesByAdresse(@Param("adresse") String adresse);
C’est équivalent à :
@Query("SELECT e FROM Entreprise e WHERE [Link] = ?1")
List<Entreprise> retrieveEntreprisesByAdresse(String adresse);
Supposons que nous avons mapper l’entité Entreprise avec la table associé T_Entreprise
• Native Query (SQL et non JPQL) :
@Query(value = "SELECT * FROM T_Entreprise e WHERE e.entreprise_adresse = :adresse",
nativeQuery = true)
List<Entreprise> retrieveEntreprisesByAdresse(@Param("adresse") String adresse);
C’est équivalent à :
@Query(value = "SELECT * FROM T_Entreprise e WHERE e.entreprise_adresse = ?1" ,
nativeQuery = true)
List<Entreprise> retrieveEntreprisesByAdresse( String adresse);
© 2024-2025 – ESPRIT – Module ASI II (Spring) – Spring - Keywords JPQL 6
JPQL : SELECT
• Ces méthodes permettent de récupérer les entreprises qui ont une équipe avec une spécialité
donnée :
• JPQL :
@Query("SELECT entreprise FROM Entreprise entreprise , Equipe equipe where
[Link] = [Link] and [Link] =:specialite")
List<Entreprise> retrieveEntreprisesBySpecialiteEquipe(@Param("specialite")
String specialite);
• Native Query (SQL et non JPQL) :
@Query(value = "SELECT * FROM T_ENTREPRISE entreprise INNER JOIN T_EQUIPE equipe
ON entreprise.ENTREPRISE_ID = equipe.ENTREPRISE_ENTREPRISE_ID where
equipe.EQUIPE_SPECIALITE =:specialite", nativeQuery = true)
List<Entreprise> retrieveEntreprisesBySpecialiteEquipe(@Param("specialite")
String specialite);
© 2024-2025 – ESPRIT – Module ASI II (Spring) – Spring - Keywords JPQL 7
JPQL : SELECT
• Cette méthode permet d’afficher les projets qui ont un coût supérieur à coût donné dt et une
technologie donnée.
• JPQL :
@Query("SELECT projet FROM Projet projet, Chambre detail where "
+ "[Link] = [Link] "
+ "and [Link] =:technologie "
+ "and detail.cout_provisoire >:cout_provisoire")
List<Projet> retrieveProjetsByCoutAndTechnologie(@Param("technologie") String technologie,
@Param("cout_provisoire") Long cout_provisoire);
• Native Query (SQL et non JPQL) :
@Query(value = "SELECT * FROM T_PROJET projet INNER JOIN T_PROJET_DETAIL detail ON
detail.PD_ID = projet.PROJET_DETAIL_PD_ID WHERE detail.PD_TECHNOLOGIE = ?1 and
detail.PD_COUT_PROVISOIRE > ?2", nativeQuery = true)
List<Projet> retrieveProjetsByCoutAndTechnologie(@Param("technologie") String technologie,
@Param("cout_provisoire") Long cout_provisoire);
© 2024-2025 – ESPRIT – Module ASI II (Spring) – Spring - Keywords JPQL 8
JPQL : SELECT
• Cette méthode permet d’afficher les équipes qui travaillent sur une technologie donnée dont le
projet n’a pas encore commencé.
• JPQL :
@Query ("SELECT equipe FROM Equipe equipe"
+ " INNER JOIN [Link] projet"
+ " INNER JOIN Chambre detail"
+ " ON [Link] = [Link]"
+ " where [Link] > current_date"
+ " and [Link] =:technologie")
List<Equipe> retrieveEquipesByProjetTechnologie(@Param("technologie")
String technologie);
© 2024-2025 – ESPRIT – Module ASI II (Spring) – Spring - Keywords JPQL 9
JPQL : UPDATE
• Si nous souhaitons faire un UPDATE, DELETE et INSERT, nous devons ajouter
l’annotaion @Modifying pour activer la modification de la base de données.
• Cette méthode permet de mettre à jour l’adresse de l’entreprise.
• JPQL :
@Modifying
@Query("update Entreprise e set [Link] = :adresse where [Link] =
:idEntreprise")
int updateEntrepriseByAdresse(@Param("adresse") String adresse,
@Param("idEntreprise")
Long idEntreprise);
© 2024-2025 – ESPRIT – Module ASI II (Spring) – Spring - Keywords JPQL 10
JPQL : DELETE
• Cette méthode permet de supprimer les entreprises qui ont une adresse donnée :
• JPQL :
@Modifying
@Query("DELETE FROM Entreprise e WHERE [Link]= :adresse")
int deleteEntreprisebyadresse(@Param("adresse") String adresse);
C’est équivalent à :
@Modifying
@Query("DELETE FROM Entreprise e WHERE [Link]= ?1")
int deleteFournisseurByCategorieFournisseur(String adresse);
© 2024-2025 – ESPRIT – Module ASI II (Spring) – Spring - Keywords JPQL 11
JPQL : INSERT
• Cette méthode permet d’insérer des projets dans la table T_Projet:
• JPQL : Nous utilisons Spring Data JPA. Or INSERT ne fait pas partie des spécifications
JPA. Donc, nous sommes obligés d’utiliser les Natives Query pour le INSERT.
• Pas de JPQL pour les requêtes INSERT.
• Native Query (SQL et non JPQL) :
@Modifying
@Query(value = "INSERT INTO T_Projet(projet_sujet) VALUES (:projetsujet)",
nativeQuery = true)
void insertProjet(@Param("projetsujet") String projetsujet);
© 2024-2025 – ESPRIT – Module ASI II (Spring) – Spring - Keywords JPQL 12
TP9
Utiliser le projet tp-foyer développé en classe, pour développer et tester les services
suivants :
- KeyWords : Créer un Service planifié qui tourne toutes les 2 minutes, qui affiche la liste
des blocs non affectés à aucun foyer.
- JPQL : Créer un Service qui permet de trouver la chambre d’un étudiant donné (selon le
CIN de l’étudiant)
- Nous ajouterons d’autres services faisant appel à des Keywords ou JPSL, en classe.
© 2024-2025 – ESPRIT – Module ASI II (Spring) – Spring - Keywords JPQL 13
TP9 – Keywords
Indication pour la méthode avec Keywords :
Dans le Repo : List<Bloc> findAllByFoyerIsNull();
Ajouter 2 blocs, un avec Foyer et un sans Foyer (n’oubliez pas le cascade dans l’entité père vers le fils)
@ManyToOne(cascade = [Link])
Foyer foyer;
{
"nomBloc": "bloc A",
"capaciteBloc": 101,
"foyer": {
"nomFoyer": "F1",
"capaciteFoyer": 1001
}
}
Puis :
{
"nomBloc": "bloc B",
"capaciteBloc": 105
}
© 2024-2025 – ESPRIT – Module ASI II (Spring) – Spring - Keywords JPQL 14
TP9 – Keywords
© 2024-2025 – ESPRIT – Module ASI II (Spring) – Spring - Keywords JPQL 15
TP9 – JPQL
Indication pour la méthode JPQL :
Pour préparer le test ajouter une chambre avec une réservation et avec un étudiant en même
temps (n’oubliez pas l’annotation cascade aux bon endroits) :
@OneToMany(cascade = [Link])
@[Link]
@JsonIgnore
Set<Reservation> reservations;
@[Link]
@JsonIgnore
@ManyToMany(cascade = [Link])
Set<Etudiant> etudiants;
© 2024-2025 – ESPRIT – Module ASI II (Spring) – Spring - Keywords JPQL 16
TP9 – JPQL
Indication pour la méthode JPQL : Pour préparer le test ajouter une chambre avec une réservation
et avec un étudiant en même temps :
{
"numeroChambre": 105,
"typeChambre": "SIMPLE",
"reservations": [
{
"idReservation": "Res-123",
"anneeUniversitaire": "2023-11-26T14:05:14.824Z",
"estValide": true,
"etudiants": [
{
"nomEtudiant": "ASKRI",
"prenomEtudiant": "Mohamed",
"cinEtudiant": 123321,
"dateNaissance": "2023-11-26T14:05:14.824Z"
}
]
}
]
} © 2024-2025 – ESPRIT – Module ASI II (Spring) – Spring - Keywords JPQL 17
TP9 – JPQL
Indication pour la méthode JPQL :
Repo:
@Query("SELECT distinct (ch) FROM Chambre ch " +
"INNER JOIN [Link] r " +
"INNER JOIN [Link] e " +
"WHERE [Link]=:cin " )
Chambre trouverChselonEt(long cin);
Entiy (pour éviter la boucle infinie car relation OneToMany :
@OneToMany(cascade = [Link])
@[Link]
@JsonIgnore
Set<Reservation> reservations;
© 2024-2025 – ESPRIT – Module ASI II (Spring) – Spring - Keywords JPQL 18
TP9 – JPQL
© 2024-2025 – ESPRIT – Module ASI II (Spring) – Spring - Keywords JPQL 19
TP9
- Quand utiliser les Keywords et quand utiliser le JPQL?
Il y a plusieurs cas, nous en parlerons en classe.
© 2024-2025 – ESPRIT – Module ASI II (Spring) – Spring - Keywords JPQL 20
Diagrammes de Classes
Le foyer est le fils
L’étudiant est le fils
© 2024-2025 – ESPRIT – Module ASI II (Spring) – Spring - Keywords JPQL