Как запустить агрегированную функцию, такую как 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 ();
Привет,