简体   繁体   English

如何在 JPA 标准 API 中进行不同的计数?

[英]How to do a distinct count in JPA critera API?

I would like to do this but with the criteria API instead:我想这样做,但使用标准 API 代替:

select count(distinct e) from Event e, IN(e.userAccessPermissions) p where p.principal = :principal and p.permission in (:permissions)

Any ideas?有任何想法吗?

You can use countDistinct on CriteriaBuilder您可以在 CriteriaBuilder 上使用 countDistinct

criteriaQuery.select(criteriaBuilder.countDistinct(entityRoot))
    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();


    }

With Spring Data Jpa, we can use this method:使用 Spring 数据 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()));
    }

Use c.distinct(true) on your Query.在查询中使用 c.distinct(true)。

See http://relation.to/Bloggers/ATypesafeCriteriaQueryAPIForJPA for more samples.有关更多示例,请参阅http://relation.to/Bloggers/ATypesafeCriteriaQueryAPIForJPA

Like this?像这样?

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"));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM