¿Cómo ejecutar una función agregada como SUM en dos columnas en JPA y mostrar sus resultados?


Soy nuevo en JPA. Así que mi pregunta debería ser tan simple para algunos.

A continuación se muestra la Consulta Simple en SQL que me gustaría convertir a JPA. Ya tengo una clase de entidad llamada TimeEnt.

SELECT 
     SUM(TimeEntryActualHours) as UnBilledHrs,
     SUM (TimeEntryAmount) as UnbilledAmount
FROM TimeEnt WHERE MatterID = 200
Author: idmean, 2010-08-10

3 answers

El Lenguaje de consulta JPA soporta funciones agregadas en la cláusula SELECT como AVG, COUNT, MAX, MIN, SUM y soporta múltiples select_expressions en la cláusula SELECT, en cuyo caso el resultado es un List de Object array (Object[]). De la especificación JPA:

4.8.1 Tipo de resultado de la Cláusula SELECT

...

El tipo de resultado de la SELECCIÓN la cláusula está definida por el resultado tipos de select_expressions contenidas en ella. Cuando múltiples select_expressions se utilizan en la SELECT clause, el resultado de la consulta es de tipo Object[], y el los elementos en este resultado corresponden en orden a la orden de sus especificación en la cláusula SELECT y en tipo a los tipos de resultados de cada una de las select_expressions.

En otras palabras, el tipo de consulta que mencionaste en un comentario (y como no proporcionaste tu entidad, basaré mi respuesta en tu ejemplo) es compatible, no hay problema. Aquí hay un ejemplo de código:

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);
}

Referencias

  • Especificación JPA 1.0
    • 4.8.1 Tipo de resultado de la Cláusula SELECT
    • 4.8.4 Funciones agregadas en la Cláusula SELECT
 39
Author: Pascal Thivent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-10 19:50:25

Pensemos que tenemos una entidad llamada 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
Author: Binu S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-06 06:47:24

Eche un vistazo a la especificación del Lenguaje de consulta EJB .

El lenguaje es muy similar al estándar SQL

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

Saludos,

 3
Author: Jose Diaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-10 13:59:36