根据条件 API 加入 table 的结果计数
Count results from joining a table based on a condition with Criteria API
我想不出什么看起来是最简单的事情,因为我在任何地方都找不到。我找到了一些使用计数的示例,但我无法将它们放入我当前的代码中。
想法是根据传递的 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));
我就是这样 select,但我如何计算链接到已通过报告的数据集的数量?我确实知道查询根必须是 Long,但后来我的脑子里又一团糟了,我无法弄清楚所有这些对象如何一起工作以及如何相互包装...
提前致谢!
解法:
You could achieve this by adding builder.count(resultSetRoot)
inside
your criteriaQuery.select
and then get the count result back by
em.createQuery(criteria).getSingleResult();
, here is the complete
part:
源代码:
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 // search count() in the webpage
诀窍是创建一个 CriteriaQuery<Long>
(而不是使用数据集类型)。从这个对象,创建 root 与 Dataset
类型。
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 count
根:
criteriaQuery.select(builder.count(root));
我想不出什么看起来是最简单的事情,因为我在任何地方都找不到。我找到了一些使用计数的示例,但我无法将它们放入我当前的代码中。
想法是根据传递的 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));
我就是这样 select,但我如何计算链接到已通过报告的数据集的数量?我确实知道查询根必须是 Long,但后来我的脑子里又一团糟了,我无法弄清楚所有这些对象如何一起工作以及如何相互包装...
提前致谢!
解法:
You could achieve this by adding
builder.count(resultSetRoot)
inside yourcriteriaQuery.select
and then get the count result back byem.createQuery(criteria).getSingleResult();
, here is the complete part:
源代码:
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 // search count() in the webpage
诀窍是创建一个 CriteriaQuery<Long>
(而不是使用数据集类型)。从这个对象,创建 root 与 Dataset
类型。
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 count
根:
criteriaQuery.select(builder.count(root));