Hibernate 4 propose une syntaxe structurée qui permet d’exploiter la plupart des fonctionnalités du SQLLangage permettant de communiquer avec une base de données.. Cette syntaxe s’articule autour de quelques classes clés.
Les classes clés pour construire une requête
EntityManager
L’EntityManager vous donne accès à votre PersistenceUnit, c’est-à-dire à votre base de données. C’est donc à partir de lui que seront construits tous les objets suivants. La configuration de la PersistenceUnit fera l’objet d’un autre article.
CriteriaBuilder
Le CriteriaBuilder est généré par l’EntityManager. Il ne correspond à aucun élément d’une requête, mais c’est une boîte à outil pour construire des requêtes.
CriteriaQuery
Il s’agit de la requête à proprement parler. Elle est instanciée par le CriteriaBuilder. Notez qu’il s’agit d’une classe typée : son type doit être le type de retour de votre requête.
Root
C’est la clause FROM de votre requête SQL. C’est donc là encore un objet typé, à la différence que T doit impérativement être une @Entity, c’est-à-dire que la classe indiquée doit correspondre à une table dans votre schéma de base de données.
TypedQuery
Il s’agit d’un objet qui encapsule l’exécution de la requête. Son type doit donc impérativement être le même que celui de la CriteriaQuery (alors qu’il peut être différent de celui du Root).
La construction de la requête
Premier exemple
Prenons un exemple très simple : imaginons que j’ai une table utilisateur dans ma base de données, j’ai donc une @Entity Utilisateur. Je souhaite lister tous mes utilisateurs, je vais donc réaliser la requête « SELECT * FROM utilisateur; » avec Hibernate 4.
Ici, nous ne nous soucierons pas de comment obtenir l’EntityManager. Cela fera l’objet d’un autre article, nous admettrons que nous avons un objet EntityManager appelé entityManager. Le code pour réaliser notre requête est alors :
{{< highlight java >}} // Je cree une instance de CriteriaBuilder a partir de mon EntityManager CriteriaBuilder builder = entityManager.getCriteriaBuilder(); // Je cree une requete qui me retournera des objets Utilisateur CriteriaQuery< utilisateur> criteriaQuery = builder.createQuery(Utilisateur.class); // Je cree ma clause FROM sous forme d un objet Root Root< utilisateur> root = criteriaQuery.from(Utilisateur.class); // J indique la valeur de la clause SELECT criteriaQuery.select(root); // Je cree une TypedQuery pour l execution de ma requete TypedQuery< utilisateur> typedQuery = entityManager.createQuery(criteriaQuery); // J execute ma requete et je recupere le resultat dans une Collection List< utilisateur> result = typedQuery.getResultList();< /utilisateur>< /utilisateur>< /utilisateur>< /utilisateur>{{< /highlight >}}
Les 5 classes citées plus haut interviennent dans ce code. Quelques commentaires :
Deuxième exemple
Reprenons l’exemple précedent, mais cette fois nous ne voulons que le nom des utilisateurs. Notre requête SQL est donc « SELECT nom FROM utilisateur ».
Le code est le suivant :
{{< highlight java >}} CriteriaBuilder builder = entityManager.getCriteriaBuilder(); CriteriaQuery< string> criteriaQuery = builder.createQuery(String.class); Root< utilisateur> root = criteriaQuery.from(Utilisateur.class); criteriaQuery.select(root.get(Utilisateur_.nom)); TypedQuery< string> typedQuery = entityManager.createQuery(criteriaQuery); List< string> result = typedQuery.getResultList();< /string>< /string>< /utilisateur>< /string>{{< /highlight >}}
Il y a deux différences :
Nous verrons dans d’autres articles comment récupérer plusieurs champs ou encore comment utiliser des fonctions telles que sum() ou count() dans la clause SELECT.
[wp-simple-survey-1]
Dans cet article, nous allons plonger dans le monde d'Hibernate 6, en commençant par reprendre les bases d’Hibernate et ses principaux concepts. Nous explorerons ensuite les nouveautés et les améliorations apportées par Hibernate 6.
Découvrez la planche #40 !
Comment optimiser ses requêtes SQL lorsqu’on est développeur d’applications web ? S’il y a bien une chose qui reste constante dans le développement informatique, c’est que toutes les applications manipulant des données structurées utilisent le SQL. Cette couche est indispensable dès que vous avez besoin de stocker et d’accéder à des données. Ainsi, peu importe le langage ou le framework que vous choisissez pour votre projet, SQL sera toujours présent. Lors des audits de performance que nous effectuons, les principales problématiques que nous rencontrons proviennent d’une mauvaise utilisation des bases de données par les applications. Il est donc crucial de bien maîtriser les principes d’optimisation SQL pour garantir des performances pérennes. Aujourd’hui, nous allons explorer ces différentes optimisations SQL, en particulier dans le cadre du développement d’applications web.