如何在JPA中的两列上运行像SUM这样的聚合函数并显示它们的结果?

2022-09-01 14:00:19

我是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 子句中的多个select_expressions,在这种情况下,结果是数组 ()。从 JPA 规范:ListObjectObject[]

4.8.1 SELECT 子句的结果类型

...

SELECT 子句的结果类型由其中包含的select_expressions的结果类型定义。当在 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 子句中的聚合函数

答案 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(); 

推荐