web-dev-qa-db-fra.com

Comment exécuter une fonction d'agrégation comme SUM sur deux colonnes dans JPA et afficher leurs résultats?

Je suis nouveau à JPA. Donc ma question devrait être si simple pour certains.

Ci-dessous, la requête simple en SQL que je voudrais convertir en JPA. J'ai déjà une classe d'entité appelée TimeEnt.

SELECT 
     SUM(TimeEntryActualHours) as UnBilledHrs,
     SUM (TimeEntryAmount) as UnbilledAmount
FROM TimeEnt WHERE MatterID = 200
27
BinCode

Le langage de requête JPA prend en charge les fonctions d'agrégat dans la clause SELECT comme AVG, COUNT, MAX, MIN, SUM et prend en charge plusieurs select_expressions dans la clause SELECT, auquel cas le résultat est un tableau List de Object (Object[]). De la spécification JPA:

4.8.1 Type de résultat de la clause SELECT

...

Le type de résultat de la clause SELECT est défini par les types de résultat des select_expressions qu'il contient. Lorsque plusieurs select_expressions sont utilisés dans la clause SELECT, le résultat de la requête est de type Object[], et les éléments de ce résultat correspondent dans l'ordre de leur spécification dans la clause SELECT et en type aux types de résultat de chacune des select_expressions .

En d'autres termes, le type de requête que vous avez mentionné dans un commentaire (et puisque vous n'avez pas fourni votre entité, je baserai ma réponse sur votre exemple) est pris en charge, pas de problème. Voici un exemple de code:

String qlString = "SELECT AVG(x.price), SUM(x.stocks) FROM Magazine x WHERE ...";
Query q = em.createQuery(qlString);
Object[] results = (Object[]) q.getSingleResult();

for (Object object : results) {
    System.out.println(object);
}

Les références

  • Spécifications JPA 1.0
    • 4.8.1 Type de résultat de la clause SELECT
    • 4.8.4 Fonctions d'agrégation dans la clause SELECT
41
Pascal Thivent

Imaginons que nous ayons une entité appelée Product:

final Query sumQuery = entityManager
                    .createQuery("SELECT SUM(p.price), SUM(p.sale) FROM Product p WHERE p.item=:ITEM AND ....");
sumQuery.setParameter("ITEM","t1");

final Object result= sumQuery.getSingleResult(); // Return an array Object with 2 elements, 1st is sum(price) and 2nd is sum(sale).

//If you have multiple rows;
final Query sumQuery = entityManager
                .createQuery("SELECT SUM(p.price), SUM(p.sale) FROM Product p WHERE p.item in (" + itemlist
                        + ") AND ....");
// Return a list of arrays, where each array correspond to 1 item (row) in resultset.
final List<IEniqDBEntity> sumEntityList = sumQuery.getResultList(); 
9
Binu S

Jetez un œil à la spécification EJB Query Language .

L'idiome est très similaire au SQL standard

EntityManager em = ...
Query q = em.createQuery ("SELECT AVG(x.price) FROM Magazine x");
Number result = (Number) q.getSingleResult ();

Cordialement,

3
Jose Diaz