JPA Criteria Query GROUP 和 COUNT over subquery

JPA Criteria Query GROUP and COUNT over subquery

给定 MY_TABLE 的以下 SQL 结构:

GROUP_LABEL | FILE  | TOPIC
-----------------------------
group A     | 1.pdf | topic A
group A     | 1.pdf | topic B
group A     | 2.pdf | topic A
group B     | 2.pdf | topic B

我的任务是将这些东西按 GROUP_LABEL 分组,同时忘记文件的不同 TOPIC。所以我的预期结果是

GROUP_LABEL | COUNT(*) 
----------------------
group A     | 2       -- two different files 1.pdf and 2.pdf here
group B     | 1       -- only one file here

纯SQL我会像

那样做
SELECT GROUP_LABEL, COUNT(*) FROM (
    SELECT DISTINCT GROUP_LABEL, FILE FROM MY_TABLE
);

是否可以将其转换为 JPA 条件 API 查询?我不知道如何将我的内部查询放入条件查询的 from 构造中,在 https://docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html/querycriteria.html 的 9.3.1 中,这似乎是不可能的。

但我简直不敢相信 ;-) 以前有人这样做过吗?内部查询将使用各种我想重用的、经过良好测试的过滤器谓词来丰富。

我主要使用标准配置的spring-boot-starter-data : 1.5.6.RELEASE

是的,可以使用 JPA javax.persistence.criteria API

Take a look at this example in the official Documentation.

首先 您的 sql 查询可以恢复为:

Select distinct GLOBAL_LABEL ,count (distinct FILE) from MY_TABLE group by GLOBAL_LABEL

其次最好不要使用主要名称来命名您的列以避免出现问题。

最终 您可以将其用作您的 HQL 查询(没有魔法):

Select distinct ge.globalLabel,count (distinct ge.file) from GlobalEntity ge group by ge.globalLabel

试试这个,

查询:select label, count(distinct file) from tableName group by label;

条件:criteria.setProjection(Projections.projectionList().add(Projections.groupProperty("label")).add(Projections.countDistinct("file")));