La clause HAVING en Hibernate 4

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.
Florent TRIPIER
Mis à jour le 24 Janv 2024

17+

ans
d'experience

60+

experts
techniques

100K

écoutes de notre podcast
logo Axopen

Comment utiliser la clause SQL HAVING avec Hibernate 4 ?

Rappel théorique

En SQLLangage permettant de communiquer avec une base de données., lorsquune requête possède une condition sur une colonne sur laquelle porte une clause GROUP BY, cette condition nest 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 dun HAVING ne vous posera pas de problème. Il faut utiliser la méthode having() de votre CriteriaQuery, de la même manière que vous utiliseriez la méthode where() : en lui passant un Predicate en paramètre.

Exemple lutilisation du multiselect) :

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Tuple> criteriaQuery = builder.createQuery(Tuple.class);
Root<Commande> root = criteriaQuery.from(Commande.class);
criteriaQuery.multiselect(root.get(Commande_.date), root.get(Commande_.departement), builder.count(root));
List<Expression<?>> 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<Tuple> typedQuery = entityManager.createQuery(criteriaQuery);
List<Tuple> result = typedQuery.getResultList();