如何在JPA critera API中进行计数?

| 我想这样做,但要使用标准API:
select count(distinct e) from Event e, IN(e.userAccessPermissions) p where p.principal = :principal and p.permission in (:permissions)
有任何想法吗?     
已邀请:
        您可以在CriteriaBuilder上使用countDistinct
criteriaQuery.select(criteriaBuilder.countDistinct(entityRoot))
    
        像这样?
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\"));
    
        在查询上使用c.distinct(true)。 有关更多示例,请参见http://relation.to/Bloggers/ATypesafeCriteriaQueryAPIForJPA。     
        
    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()));
    }
    

要回复问题请先登录注册