JPA和聚合函数。我如何使用查询结果?

12

我对ORM存取有些陌生,需要帮助理解一下。

假设我有以下标准SQL查询:

SELECT *, COUNT(test.testId) AS noTests FROM inspection
LEFT JOIN test ON inspection.inspId = test.inspId
GROUP BY inspection.inspId

我希望在JPA中使用它。

我有一个检查实体与一个测试实体之间的一对多关系。(一个检查有多个测试) 我尝试用JPQL编写了以下代码:

which I want to use in JPA.

I have an Inspection entity with a one-to-many relationship to a Test entity. (an inspection has many tests) I tried writing this in JPQL:


Query query = em.createQuery("SELECT insp, COUNT(???what???) " +
      "FROM Inspection insp LEFT JOIN insp.testList " +  
      "GROUP BY insp.inspId");

1) 我应该如何编写 COUNT 子句?我需要对来自 test 表的元素应用 count,但是 testList 是一个集合,所以我无法像这样做 COUNT(insp.testList.testId)

2) 假设问题1已解决,返回的对象类型将绝对不是 Inspection 对象... 我应该如何使用结果?

1个回答

20
  1. 你可以使用AS给连接实体起别名。
  2. 你可以创建一个新对象,也可以使用返回值创建一个List

因此:

SELECT new com.yourproject.ResultHolder(insp, COUNT(test.testId)) 
    FROM Inspection insp LEFT JOIN  insp.testList AS test GROUP BY insp.inspId
或者
SELECT new list(insp, COUNT(test.testId)) 
    FROM Inspection insp LEFT JOIN  insp.testList AS test GROUP BY insp.inspId

结果可以通过一个 ResultHolder 实例或者一个 java.util.List 来访问。若使用 List,则 insp 可以通过 list.get(0) 获取,而 count 可以通过 list.get(1) 获取。


在JPA查询中使用聚合函数会对性能产生什么影响? - Juzer Ali

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