Как запустить агрегатную функцию, такую ​​​​как SUM, для двух столбцов в JPA и отобразить их результаты?

Я новичок в JPA. Так что мой вопрос должен быть таким простым для некоторых.

Ниже приведен простой запрос в SQL, который я хотел бы преобразовать в JPA. У меня уже есть класс сущностей с именем TimeEnt.

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

person BinCode    schedule 10.08.2010    source источник


Ответы (3)


Язык запросов JPA поддерживает агрегатные функции в предложении SELECT, такие как AVG, COUNT, MAX, MIN, SUM, и поддерживает несколько выражений select_expressions в предложении SELECT, и в этом случае результатом является массив List из Object. (Object[]). Из спецификации JPA:

4.8.1 Тип результата предложения SELECT

...

Тип результата предложения SELECT определяется типами результатов содержащихся в нем select_expressions. Если в предложении SELECT используется несколько выражений select_expressions, результат запроса имеет тип Object[], а элементы в этом результате соответствуют порядку их указания в предложении SELECT и in type к типам результатов каждого из select_expressions.

Другими словами, тип запроса, который вы упомянули в комментарии (а поскольку вы не указали свою сущность, я буду основывать свой ответ на вашем примере), поддерживается, нет проблем. Вот пример кода:

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

использованная литература

  • JPA 1.0 Specification
    • 4.8.1 Result Type of the SELECT Clause
    • 4.8.4 Агрегатные функции в предложении SELECT
person Pascal Thivent    schedule 10.08.2010

Предположим, у нас есть объект с именем 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(); 
person Binu S    schedule 04.07.2012

Взгляните на спецификацию языка запросов EJB.

Идиома очень похожа на стандартный SQL

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

С уважением,

person Jose Diaz    schedule 10.08.2010
comment
Как бы я обработал результат, если бы там было две функции? EntityManager em = ... Query q = em.createQuery (SELECT AVG (x.price), SUM (x.stocks) FROM Magazine x); - person BinCode; 10.08.2010
comment
Ну, я не знаю, если такой запрос поддерживается JPA, однако вы всегда можете выполнить два запроса для достижения этого. С Уважением. - person Jose Diaz; 10.08.2010
comment
Я полагаю, вы имеете в виду Java Persistence Query Language? - person ᴠɪɴᴄᴇɴᴛ; 13.01.2016