Dans cet article


Offres d'emploi

Tags

Les requêtes avec Hibernate 4

Les requêtes avec Hibernate 4

Hibernate 4 propose une syntaxe structurée qui permet d’exploiter la plupart des fonctionnalités du SQL. 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 :

// 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>

Les 5 classes citées plus haut interviennent dans ce code. Quelques commentaires :

  • La requête retourne le type Utilisateur : cela correspond bien à toutes les colonnes de la table utilisateur, c’est-à-dire « * FROM utilisateur » ;
  • l’objet Root est obtenu à partir de la CriteriaQuery : en effet, il s’agit de la clause FROM de cette requête en particulier. Ce détail sera important lorsque vous aurez des sous-requêtes.
  • la TypedQuery est, elle, obtenue à travers l’EntityManager : en effet, cet objet ne fait qu’exécuter la CriteriaQuery, or cette requête est bien exécutée sur le schéma représenté par l’EntityManager.

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 :

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>

Il y a deux différences :

  • j’indique en paramètre de la fonction select() le champ du metamodel de la classe Utilisateur qui correspond au champ que je veux récupérer ;
  • le type de la CriteriaQuery et de la TypedQuery ne sont plus Utilisateur mais String puisque c’est bien un String que je souhaite obtenir.

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]

L'équipe AXOPEN

Voir aussi les articles suivants

Hibernate et la LazyInitializationException

Hibernate et la LazyInitializationException

Le 12/09/2013 par Florent Tripier

Les développeurs utilisant Hibernate sont tôt ou tard amenés à se heurter à sa fameuse LazyInitializationException. Voyons dans quelles circonstances elle est levée et comment l’éviter définitivement. Pourquoi la LazyInitializationException ? Pour les victimes de la LazyInitializationException, les raisons de sa propagation sont souvent obscures et ils ont tendance à imaginer que son apparition est plus ou moins aléatoire. Il n’en est pourtant rien. Contexte : le lazy loading La <span .
Lire l'article

HaProxy: JBoss EAP 6.1 et MySql Réplication

HaProxy: JBoss EAP 6.1 et MySql Réplication

Le 28/08/2013 par Florent Tripier

Lors de l’utilisation de HAPROXY vers deux Mysql en master/slave, lors de l’arrêt d’un des deux serveurs Mysql, le serveur JBoss n’arrive pas à se reconnecer à la base de données. Etudions ici la configuration, l’installation de Haproxy et de JBoss. Versions utilisées: JBoss EAP 6.1 Mysql 5.5 Configuration de HAPROXY Dans cette configuration, nous utilisons une réplication entre un Mysql Master et un Slave. L’idée est d’avoir un failover lors de la chute du master vers le server de backup, ici le 192.
Lire l'article

BigData: Hbase et architecture de projet avec JBoss EAP 6.1
Le but du jeu de cet exemple est de créer un projet RESTfull qui insère des données dans une base HBase. Ces services web seront exposés sur un serveur JEE JBoss EAP 6.1. Installer HBase Premièrement, il faut installer une base Hbase sur un serveur linux. Il est possible de l’installer sur un serveur windows, mais ceci est plus compliqué à réaliser. Nous ne traiterons pas de l’installation de HBase dans ce post car il existe de nombreux tutoriels très bien faits sur le net.
Lire l'article