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

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

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

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

Ответы [ 3 ]

41 голосов
/ 10 августа 2010

Язык запросов 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
9 голосов
/ 04 июля 2012

Давайте подумаем, что у нас есть сущность с именем 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 голосов
/ 10 августа 2010

Посмотрите на спецификацию EJB Query Language .

Эта идиома очень похожа на стандартную SQL

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

С уважением,

...