JPA Criteria API中如何进行唯一计数?

21

我想使用条件API来完成这个操作:

select count(distinct e) from Event e, IN(e.userAccessPermissions) p where p.principal = :principal and p.permission in (:permissions)
任何想法?
4个回答

48

你可以在CriteriaBuilder中使用countDistinct。

criteriaQuery.select(criteriaBuilder.countDistinct(entityRoot))

0

像这样吗?

Criteria crit = session.createCriteria(Event.class):
crit.createAlias("userAccessPermissions", "p");
crit.add(Restrictions.eq("p.principal", principal);
crit.add(Restrictions.in("p.permission", permissions);
crit.setProjection(Projections.countDistinct("id"));

2
这不是JPA,但问题是什么。 - DataNucleus
2
哎呀,被 Hibernate 标签误导了,tx。 - Stijn Geukens

0

1
如果您能为我提供一个在我的特定情况下如何实现的示例,我会非常感激。因为我已经在标准查询 API 中使用了“distinct”,但出于某种原因,这个用例并不适用于我。 - Piotr

0
    public long getCount(String xValue){
      EntityManager entityManager = this.getEntityManager();

      CriteriaBuilder cb = entityManager.getCriteriaBuilder();
      CriteriaQuery<Long> criteriaQuery = cb.createQuery(Long.class);
      Root<MyEntity> root = criteriaQuery.from(MyEntity.class);

      criteriaQuery.select(cb.count(criteriaQuery.from(MyEntity.class)));

      List<Predicate> predicates = new ArrayList<>();

      Predicate xEquals = cb.equal(root.get("x"), xValue);
      predicates.add(xEquals);

      criteriaQuery.select(cb.countDistinct(root));
      criteriaQuery.where(predicates.toArray(new Predicate[0]));

      return entityManager.createQuery(criteriaQuery).getSingleResult();


    }

使用Spring Data Jpa,我们可以使用这个方法:

     /*
     * (non-Javadoc)
     * @see org.springframework.data.jpa.repository.JpaSpecificationExecutor#count(org.springframework.data.jpa.domain.Specification)
     */
    @Override
    public long count(@Nullable Specification<T> spec) {
        return executeCountQuery(getCountQuery(spec, getDomainClass()));
    }

使用Spring Data JPA, - kafkas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接