我是 JPA 的新手。所以我的问题对某些人来说应该很简单。
下面是我想转换为 JPA 的 SQL 中的简单查询。我已经有一个名为TimeEnt
.
SELECT
SUM(TimeEntryActualHours) as UnBilledHrs,
SUM (TimeEntryAmount) as UnbilledAmount
FROM TimeEnt WHERE MatterID = 200
JPA 查询语言确实支持 SELECT 子句中的聚合函数,例如 AVG、COUNT、MAX、MIN、SUM,并且确实支持 SELECT 子句中的多个select_expressions,在这种情况下,结果是List
数组Object
( Object[]
)。从 JPA 规范:
4.8.1 SELECT 子句的结果类型
...
SELECT 子句的结果类型由其中包含的select_expressions的结果类型定义 。在 SELECT 子句中使用多个 select_expression时,查询的结果是 type
Object[]
,并且该结果中的元素按照它们在 SELECT 子句中指定的顺序和 type 对应于每个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);
}
让我们假设我们有一个名为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();
查看EJB 查询语言规范。
该成语与标准 SQL 非常相似
EntityManager em = ...
Query q = em.createQuery ("SELECT AVG(x.price) FROM Magazine x");
Number result = (Number) q.getSingleResult ();
问候,