【问题标题】:JPA Criteria Query GROUP and COUNT over subqueryJPA Criteria Query GROUP 和 COUNT over subquery
【发布时间】:2017-08-07 14:48:07
【问题描述】:

给定以下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 分组,同时忘记文件的不同TOPICs。所以我的预期结果是

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,主要是标准配置。

【问题讨论】:

    标签: java spring hibernate jpa jpa-criteria


    【解决方案1】:

    试试这个,

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这看起来不错,我已经使用 CriteriaBuilder 成功地将它转换为 Criteria API。 count(distinct FILE) 完成了这项工作。如果您使用 CriteriaBuilder 的 sn-p 更新您的答案,我会接受它。
      【解决方案3】:
      猜你喜欢
      • 2017-07-17
      • 2015-02-27
      • 2020-02-22
      • 2012-09-07
      • 1970-01-01
      • 2013-08-25
      • 1970-01-01
      • 2013-11-02
      • 2014-08-02
      相关资源
      最近更新 更多