如何在JPA中对两列运行聚合函数(例如SUM)并显示它们的结果?

28

我是JPA的新手,所以我的问题对于有些人来说可能很简单。

下面是我想转换为JPA的简单SQL查询。我已经有一个名为TimeEnt的实体类。

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

42
JPA查询语言支持在SELECT子句中使用聚合函数,如AVG、COUNT、MAX、MIN和SUM,并支持在SELECT子句中使用多个select_expressions。在这种情况下,结果是一个ListObject数组(Object[])。引用JPA规范中的表述,当在SELECT子句中使用多个select_expressions时,查询结果的类型为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

假设我们有一个实体称为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(); 

5
请查看EJB查询语言规范。这种习惯用法与标准SQL非常相似。
EntityManager em = ...
Query q = em.createQuery ("SELECT AVG(x.price) FROM Magazine x");
Number result = (Number) q.getSingleResult ();

敬礼,


如果有两个函数,我该如何处理结果呢? EntityManager em = ... Query q = em.createQuery ("SELECT AVG(x.price),SUM (x.stocks) FROM Magazine x"); - BinCode
嗯,我不确定JPA是否支持这种查询,但是你总可以执行两个查询来实现。祝好。 - Jose Diaz
我想你是指 Java 持久化查询语言 吧? - ᴠɪɴᴄᴇɴᴛ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接