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

Posted

技术标签:

【中文标题】如何在 JPA 的两列上运行像 SUM 这样的聚合函数并显示它们的结果?【英文标题】:How to run an aggregate function like SUM on two columns in JPA and display their results? 【发布时间】:2011-03-27 20:32:55 【问题描述】:

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

下面是我想转换为 JPA 的 SQL 中的简单查询。我已经有一个名为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,在这种情况下,结果是 @ 987654321@ 的 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 ();

问候,

【讨论】:

如果有两个函数,我将如何处理结果? EntityManager em = ... Query q = em.createQuery ("SELECT AVG(x.price),SUM (x.stocks) FROM Magazine x"); 好吧,如果 JPA 支持这种查询,我不支持,但是,您总是可以执行两个查询来实现这一点。问候。 我猜你的意思是Java Persistence Query Language

以上是关于如何在 JPA 的两列上运行像 SUM 这样的聚合函数并显示它们的结果?的主要内容,如果未能解决你的问题,请参考以下文章

如何在JPA / JAVA / Hibernate的两列中插入自动生成的ID

索引视图的两列上的唯一聚集索引

如何合并熊猫数据框中的两列,堆叠在顶部

如何在两列上立方体,就好像它们是一列一样?

如何将所有行的两列总和为第三列

同一列上具有多个聚合的 T-SQL Pivot