How to do a distinct count in JPA critera API?

后端 未结 4 1484
盖世英雄少女心
盖世英雄少女心 2021-02-13 10:14

I would like to do this but with the criteria API instead:

select count(distinct e) from Event e, IN(e.userAccessPermissions) p where p.principal = :principal an         


        
相关标签:
4条回答
  • 2021-02-13 10:27

    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"));
    
    0 讨论(0)
  • 2021-02-13 10:31

    You can use countDistinct on CriteriaBuilder

    criteriaQuery.select(criteriaBuilder.countDistinct(entityRoot))
    
    0 讨论(0)
  • 2021-02-13 10:46
        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:

         /*
         * (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()));
        }
    
    0 讨论(0)
  • 2021-02-13 10:49

    Use c.distinct(true) on your Query.

    See http://relation.to/Bloggers/ATypesafeCriteriaQueryAPIForJPA for more samples.

    0 讨论(0)
提交回复
热议问题