如何在JPA中的两列上运行SUM等聚合函数并显示其结果?

Bin*_*ode 28 java orm jpa java-ee-6 jpa-2.0

我是JPA的新手.所以我的问题对某些人来说应该是如此简单.

下面是SQL中的简单查询,我想将其转换为JPA.我已经有一个实体类叫TimeEnt.

SELECT 
     SUM(TimeEntryActualHours) as UnBilledHrs,
     SUM (TimeEntryAmount) as UnbilledAmount
FROM TimeEnt WHERE MatterID = 200
Run Code Online (Sandbox Code Playgroud)

Pas*_*ent 41

在JPA查询语言确实像AVG,COUNT,MAX,MIN,SUM SELECT子句中载体聚集体的功能和不支持多个select_expressions SELECT子句中,在这种情况下,结果是一个ListObject阵列(Object[]).从JPA规范:

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);
}
Run Code Online (Sandbox Code Playgroud)

参考

  • 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(); 
Run Code Online (Sandbox Code Playgroud)


Jos*_*iaz 5

查看EJB 查询语言规范。

习惯用法与标准 SQL 非常相似

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

问候,