JPA Criteria查询GROUP和COUNT超过子查询

时间:2017-08-07 14:48:07

标签: java spring hibernate jpa jpa-criteria

给定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 Criteria API查询?我没有任何想法让我的内部查询进入Criteria查询的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

3 个答案:

答案 0 :(得分:1)

试试这个,

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

标准:criteria.setProjection(Projections.projectionList().add(Projections.groupProperty("label")).add(Projections.countDistinct("file")));

答案 1 :(得分:0)

答案 2 :(得分:0)

首先你的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