Requêtes de critères utilisant le métamodèle JPA

1. Vue d'ensemble

Dans ce didacticiel, nous verrons comment utiliser les classes de métamodèles statiques JPA lors de l'écriture de requêtes de critères dans Hibernate.

Nous aurons besoin d'une compréhension de base des API de requête de critères dans Hibernate, veuillez donc consulter notre didacticiel sur les requêtes de critères pour plus d'informations sur ce sujet, si nécessaire.

2. Pourquoi le métamodèle JPA?

Souvent, lorsque nous écrivons une requête de critères, nous devons référencer les classes d'entités et leurs attributs.

Maintenant, une des manières de faire ceci est de fournir les noms des attributs sous forme de chaînes. Mais cela présente plusieurs inconvénients.

D'une part, nous devons rechercher les noms des attributs d'entité. Et, au cas où un nom de colonne serait modifié plus tard dans le cycle de vie du projet, nous devons refactoriser chaque requête où le nom est utilisé.

Le métamodèle JPA a été introduit par la communauté pour éviter ces inconvénients et fournir un accès statique aux métadonnées des classes d'entités gérées.

3. Classe d'entité

Prenons un scénario dans lequel nous construisons un système de gestion de portail étudiant pour l'un de nos clients, et une exigence se présente pour fournir une fonctionnalité de recherche sur les étudiants en fonction de leur année de fin d'études.

Tout d'abord, regardons notre classe d' étudiants :

@Entity @Table(name = "students") public class Student { @Id @GeneratedValue(strategy = GenerationType.AUTO) private int id; @Column(name = "first_name") private String firstName; @Column(name = "last_name") private String lastName; @Column(name = "grad_year") private int gradYear; // standard getters and setters }

4. Génération de classes de métamodèles JPA

Ensuite, nous devons générer les classes de métamodèles, et pour cela, nous utiliserons l'outil générateur de métamodèles fourni par JBoss. JBoss n'est qu'un des nombreux outils disponibles pour générer le métamodèle. D'autres outils appropriés incluent EclipseLink, OpenJPA et DataNucleus.

Pour utiliser l'outil JBoss, nous devons ajouter la dernière dépendance dans notre fichier pom.xml , et l'outil générera les classes de métamodèle une fois que nous aurons déclenché la commande maven build:

 org.hibernate hibernate-jpamodelgen 5.3.7.Final 

Notez que nous devons ajouter le dossier target / generated-classes au chemin de classe de notre IDE , car par défaut, les classes seront générées dans ce dossier uniquement.

5. Classes de métamodèles JPA statiques

Sur la base de la spécification JPA, une classe générée résidera dans le même package que la classe d'entité correspondante et aura le même nom avec un «_» (trait de soulignement) ajouté à la fin. Ainsi, la classe de métamodèle générée pour la classe Student sera Student_ et ressemblera à quelque chose comme:

@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor") @StaticMetamodel(Student.class) public abstract class Student_ { public static volatile SingularAttribute firstName; public static volatile SingularAttribute lastName; public static volatile SingularAttribute id; public static volatile SingularAttribute gradYear; public static final String FIRST_NAME = "firstName"; public static final String LAST_NAME = "lastName"; public static final String ID = "id"; public static final String GRAD_YEAR = "gradYear"; }

6. Utilisation des classes de métamodèle JPA

Nous pouvons utiliser les classes de métamodèles statiques de la même manière que nous utiliserions les références String aux attributs. L'API de requête de critères fournit des méthodes surchargées qui acceptent les références String ainsi que les implémentations d'interface d' attribut .

Examinons la requête de critères qui récupérera tous les étudiants qui ont obtenu leur diplôme en 2015:

//session set-up code CriteriaBuilder cb = session.getCriteriaBuilder(); CriteriaQuery criteriaQuery = cb.createQuery(Student.class); Root root = criteriaQuery.from(Student.class); criteriaQuery.select(root).where(cb.equal(root.get(Student_.gradYear), 2015)); Query query = session.createQuery(criteriaQuery); List results = query.getResultList();

Remarquez comment nous avons utilisé la référence Student_.gradYear au lieu d'utiliser le nom de colonne conventionnel grad_year .

7. Conclusion

Dans cet article rapide, nous avons appris comment utiliser les classes de métamodèles statiques et pourquoi elles peuvent être préférées à la manière traditionnelle d'utiliser les références String comme décrit précédemment.

Le code source de ce tutoriel se trouve à l'adresse over sur Github.