AXOPEN

La clause HAVING en Hibernate 4

Comment utiliser la clause SQL HAVING avec Hibernate 4 ?

Rappel théorique

En SQL, lorsqu’une requête possède une condition sur une colonne sur laquelle porte une clause GROUP BY, cette condition n’est pas exprimée dans la clause WHERE mais dans la clause HAVING.

En pratique

Si vous savez faire une requête simple avec Hibernate 4, écrire une condition simple et utiliser la clause GROUP BY, la mise en place d’un HAVING ne vous posera pas de problème. Il faut utiliser la méthode having() de votre CriteriaQuery<T>, de la même manière que vous utiliseriez la méthode where() : en lui passant un Predicate en paramètre.

Exemple : le nombre de commandes par jour et par département excepté le 75 (voir ici pour l’utilisation du multiselect) :

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery criteriaQuery = builder.createQuery(Tuple.class);
Root root = criteriaQuery.from(Commande.class);
criteriaQuery.multiselect(root.get(Commande_.date), root.get(Commande_.departement), builder.count(root));
List> groupList = new ArrayList();
groupList.add(root.get(Commande_.date));
groupList.add(root.get(Commande_.departement));
criteriaQuery.groupBy(groupList);
Predicate predicate = builder.notEqual(root.get(Commande_.departement), "75");
criteriaQuery.having(predicate);
TypedQuery typedQuery = entityManager.createQuery(criteriaQuery);
List result = typedQuery.getResultList();