使用 Criteria API 根据条件计算加入表的结果

Posted

技术标签:

【中文标题】使用 Criteria API 根据条件计算加入表的结果【英文标题】:Count results from joining a table based on a condition with Criteria API 【发布时间】:2018-09-17 06:45:41 【问题描述】:

我无法弄清楚什么是最简单的事情,因为我在任何地方都找不到。我发现了一些关于使用计数的示例,但我无法将它们放入我当前的代码中。

这个想法是根据传递的 id 计算有多少实体链接到另一个实体。

代码如下:

   final EntityManager em = this.entityManager();
   final CriteriaBuilder builder = em.getCriteriaBuilder();
   final CriteriaQuery<Dataset> criteriaQuery = builder.createQuery(Dataset.class);
   final Root<Dataset> resultSetRoot = criteriaQuery.from(Dataset.class);
   final SetJoin<Dataset, Report> join = resultSetRoot.join(Dataset_.reports);
   criteriaQuery.select(resultSetRoot).where(builder.equal(join.get(Report_.id), reportId));

这就是我选择的方式,但是我如何计算链接到通过的报告的数据集的数量?我确实知道查询根必须是 Long ,但是这一切又在我的脑海中一团糟,我无法弄清楚所有这些对象如何一起工作并且可以相互包裹......

提前谢谢你!

【问题讨论】:

【参考方案1】:

解决方案:

您可以通过在里面添加builder.count(resultSetRoot) 来实现这一点 你的criteriaQuery.select 然后得到计数结果 em.createQuery(criteria).getSingleResult();,这里是完整的 部分:


源代码:

final EntityManager em = this.entityManager();
final CriteriaBuilder builder = em.getCriteriaBuilder();
final CriteriaQuery < Dataset > criteriaQuery = builder.createQuery(Dataset.class);
final Root < Dataset > resultSetRoot = criteriaQuery.from(Dataset.class);
final SetJoin < Dataset, Report > join = resultSetRoot.join(Dataset_.reports);

criteriaQuery.select(builder.count(resultSetRoot)).where(builder.equal(join.get(Report_.id), reportId));

Long count = em.createQuery(criteria).getSingleResult();

更多信息:

In JPA 2, using a CriteriaQuery, how to count results https://gist.github.com/ufuk/2ca63e392cc61d5b5277249dc23d4eca // 在网页中搜索 count()

【讨论】:

这是很多细节!谢谢!【参考方案2】:

诀窍是创建一个CriteriaQuery&lt;Long&gt;(而不是使用 Dataset 类型)。从这个对象,创建具有Dataset 类型的root

CriteriaQuery<Long> countQuery = builder.createQuery(Long.class);
Root<Dataset> root = countQuery.from(Dataset.class);

然后,像往常一样添加where 部分:

Join<Dataset, Report> join = root.join(Dataset_.reports);
countQuery.where(builder.equal(join.get(Report_.id), reportId))

最后,执行 select counting root:

criteriaQuery.select(builder.count(root));

【讨论】:

以上是关于使用 Criteria API 根据条件计算加入表的结果的主要内容,如果未能解决你的问题,请参考以下文章

如何在多个条件上加入,返回两个条件的所有组合

根据条件VBA删除表行

根据条件选择加入表

excel多条件计算不重复数据个数

hibernate.jpa.criteria.BasicPathUsageException:无法加入基本类型的属性

DetachedCriteria和Criteria