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

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

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

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

Ответ 1

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

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

...

Тип результата SELECT определяется результатом типы select_expressions содержащихся в нем. Когда несколько select_expressions используются в SELECT, результат запроса имеет тип Object[], а элементы в этом результате соответствуют порядок в порядке их спецификация в предложении SELECT и по типу к типам результатов каждый из 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
    • 4.8.1 Результат Тип предложения SELECT
    • 4.8.4 Агрегатные функции в разделе SELECT

Ответ 2

Давайте подумаем, что у нас есть объект, называемый 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(); 

Ответ 3

Взгляните на спецификацию EJB Query Language.

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

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

Привет,