Dans cet article


Offres d'emploi

Tags

Hibernate 4 et les fonctions d’agrégat

Hibernate 4 et les fonctions d’agrégat

En SQL, les fonctions d’agrégat sont les fonctions COUNT(), SUM(), MIN(), MAX() et AVG(). Comment réaliser des requêtes avec de telles fonctions dans la clause SELECT en Hibernate 4 ?

Théorie

Si vous n’êtes pas familier avec Hibernate 4, reportez-vous préalablement à l’article  ».

Les fonctions d’agrégats sont fournies par le CriteriaBuilder. Il suffit donc de passer en paramètre à votre fonction select() non pas un champ ou un Root mais la fonction d’agrégat. Vous passez en paramètre à celles-ci les champs concernés.

Exemple

Si je veux compter les commandes :

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<
Long> criteriaQuery = builder.createQuery(Long.class);
Root<
Commande> root = criteriaQuery.from(Commande.class);
criteriaQuery.select(builder.count(root));
TypedQuery<
Long> typedQuery = entityManager.createQuery(criteriaQuery);
Long result = typedQuery.getSingleResult();

ou si je cherche le montant le plus élevé :

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<
Double> criteriaQuery = builder.createQuery(Double.class);
Root<
Commande> root = criteriaQuery.from(Commande.class);
criteriaQuery.select(builder.max(root.get(Commande_.total)));
TypedQuery<
Double> typedQuery = entityManager.createQuery(criteriaQuery);
List<
Double> result = typedQuery.getResultList();

ou encore si je veux connaître le panier moyen :

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<
Double> criteriaQuery = builder.createQuery(Double.class);
Root<
Commande> root = criteriaQuery.from(Commande.class);
criteriaQuery.select(builder.avg(root.get(Commande_.total)));
TypedQuery<
Double> typedQuery = entityManager.createQuery(criteriaQuery);
List<
Double> result = typedQuery.getResultList();

Attention ! N’oubliez pas de modifier le type de votre CriteriaQuery et de votre TypedQuery en fonction de ce que vous voulez ramener. 

Remarque : si votre clause SELECT contient un COUNT() et rien d’autre, et seulement dans ce cas là, vous pouvez appeler la fonction getSingleResult() à la place de getResultList(). Pourquoi pas le reste du temps ? Parce que getSingleResult() propage une exception lorsque la requête ramène un nombre de résultat différent de 1 (zéro compris). Or COUNT() ramène forcément un résultat puisque s’il ne trouve rien il renvoie 0, alors que SUM() par exemple est susceptible de retourner NULL.

L'équipe AXOPEN

Voir aussi les articles suivants

Le multiselect avec Hibernate 4

Le multiselect avec Hibernate 4

Le 05/11/2013 par Florent Tripier

Nous avons vu dans l’article « Les requêtes avec Hibernate 4 » comment réaliser une requête ramenant soit un champ soit tous les champs (SELECT *). Voyons à présent comment ramener plusieurs champs mais pas tous. Le code côté Hibernate Pour ce faire, nous avons recours à la fonction multiselect() de la classe CriteriaQuery. Cette fonction prend en paramètres soit une List de champs, soit n paramètres représentant des champs ou des fonctions.
Lire l'article

Les requêtes avec Hibernate 4

Les requêtes avec Hibernate 4

Le 02/10/2013 par Florent Tripier

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.
Lire l'article

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