AXOPEN

Les nativeQuery en Hibernate 4, ou comment lancer une requête écrite « en dur »

Hibernate permet de répondre à la plupart des besoins pour créer des requêtes de tout type : du simple « SELECT FROM » aux plus complexes des requêtes imbriquées.

Pourtant, cette API ne permet pas de réaliser toutes les requêtes que l’on désire. En effet, il est malheureusement impossible de créer une requête composée d’un « MINUS », ou d’un « INTERSECT ». Il est aussi impossible d’utiliser. par exemple, des REGEX dans nos requêtes. Pourtant, il faut bien pouvoir les créer, ces requêtes.

Hibernate propose pour se faire une fonction permettant de lancer une requête écrite « en dur », c’est à dire en texte directement : la createNativeQuery.

1. Les prérequis

Pour comprendre cet article, il est utile de savoir comment fonctionne une requête Hibernate. (Accéder à l’article « Les requêtes avec Hibernate 4« ).

 

2. Fonctionnement de la nativeQuery

Dans notre exemple, nous avons une table « ADHERENT« . Dans cette table, on enregistre, entre autre, des codes adhérent. Certains ont une ou plusieurs lettres, d’autres n’en ont pas.
Notre objectif est de savoir combien d’adhérents ont un code ayant au moins une lettre. L’utilisation d’une REGEX est alors préconisée.
Cette opération n’est pas possible via les clauses classiques Hibernate. Il faut donc utiliser la nativeQuery

EntityManager em = EntityManagerUtil.getEntityManager();
 /*
  * SELECT COUNT(*)
  * FROM adherent
  * WHERE code REGEXP '[a-zA-Z]+'
  */

// On écrit la requête
String requete = "SELECT COUNT(*) FROM adherent WHERE code REGEXP '[a-zA-Z]+'";

// On lance la requête et on enregistre le résultat, puis on le retourne
BigInteger lResult = (BigInteger) em.createNativeQuery(requete).getSingleResult();
return lResult != null ? lResult.intValue() : 0;

 

3. Aller plus loin avec Hibernate 4

Dévouvrez de nombreux articles sur Hibernate 4 ;