使用Criteria API根据条件对连接表进行计数

时间:2018-09-17 06:45:42

标签: java jpa criteria-api

我找不到最简单的东西,因为在任何地方都找不到。我找到了一些使用count的示例,但是我无法在当前代码中使用它们。

该想法是根据传递的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,但后来又把它弄乱了,我无法弄清楚所有这些对象是如何协同工作的,并且可以彼此包裹在一起...

提前谢谢!

2 个答案:

答案 0 :(得分: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();

更多信息:

  

答案 1 :(得分:0)

诀窍是创建一个 CriteriaQuery<Long>(而不是使用 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))

最后,执行选择 count 根:

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