当前位置: 首页 > 知识库问答 >
问题:

JPA从现有CriteriaQuery创建计数查询

唐炜
2023-03-14
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<A> cq = cb.createQuery(A.class);
        Root<A> root = cq.from(A.class);
        CriteriaQuery<Long> cq = cb.createQuery(A.class);
        Root<A> rootCount = countQuery.from(A.class);

        List<Predicate> predicates = new ArrayList<>();
        List<Predicate> predicatesCount = new ArrayList<>();
        
        Predicate p = cb.equal(root.get(A.ID), 1);
        predicates.add(p);
        Predicate p1 = cb.equal(rootCount.get(A.ID), 1);
        predicatesCount.add(p1);
        ...
        // execute both query to get result

感谢阅读!

共有1个答案

鲜于德业
2023-03-14

下面的示例展示了如何设置标准构建器/谓词限制,然后重用该限制来执行计数查询。

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<EntityStub> criteriaQuery = builder.createQuery(EntityStub.class);
Root<EntityStub> entity_ = criteriaQuery.from(EntityStub.class);
entity_.alias("entitySub"); //assign alias to entity root

criteriaQuery.where(builder.equal(entity_.get("message"), "second"));

// Generic retrieve count
CriteriaQuery<Long> countQuery = builder.createQuery(Long.class);
Root<T> entity_ = countQuery.from(criteriaQuery.getResultType());
entity_.alias("entitySub"); //use the same alias in order to match the restrictions part and the selection part
countQuery.select(builder.count(entity_));
Predicate restriction = criteriaQuery.getRestriction();
if (restriction != null) {
  countQuery.where(restriction); // Copy restrictions
}
Long count = entityManager.createQuery(countQuery).getSingleResult();

看看这是否对您有帮助,注意根别名,在执行计数查询时,确保实体类类型是long.class

https://forum.hibernate.org/viewtopic.php?p=2471522p2471522

 类似资料:
  • 我使用JPA CriteriaQuery构建动态查询,并传入一个Spring数据分页对象: 在后端,我的存储库中有一个方法来支持动态查询: 但是,返回的数据是未排序的,所以我想问的是,在CriteriaQuery中实现分页的任何方法。

  • 我试图用一个CriteriaQuery在JPA/Hibernate中复制这个查询的结果。 daysBack值作为参数传入。 日志输出为:测量表的计数为:36 然而,表中只有6行,这向我表明正在生成某种自连接或交叉积来创建36的输出。我应该做什么不同的事情来获得正确的计数?

  • 问题内容: 我有一个问题,我需要使用LEAST和GREATEST函数联接两个表,但要使用JPA CriteriaQuery。这是我要复制的SQL … 我看过CriteriaBuilder.least(..)和great(..),但是在尝试理解如何创建传递给任何一个函数的过程中遇到了困难。 问题答案: 事实证明,CriteriaBuilder确实支持将LEAST和GREATEST作为非聚合函数来调用

  • 我对JPA相当陌生,它是CriteriaBuilder/CriteriaQuery API: 我想查询一组对象的摘录(如下所示,我只选择结果中的元素n到m) 查询本身运行良好,我得到了预期的结果。 但是如果我尝试计算所有可能的结果,我会得到一个java。lang.IllegalArgumentException: org.hibernate.hql.internal.ast.无效路径:'生成lia

  • 我在用户和电话号码之间有一种“一对一”的关系。因此,一个用户可以有多个电话号码。 在前端,我必须只提取登录用户的电话号码,或者如果用户是管理员,我必须显示所有用户的电话号码。我已经设法实现了这一部分,但我遇到的问题如下:在前端,用户还有一个“电话号码”搜索框。因此,如果用户或管理员搜索987(比如前3位数字),则应显示包含“987”且与其个人资料相关联的任何电话号码。如果用户是管理员,我应该显示包