How to do a distinct count in JPA critera API?

血红的双手。 提交于 2019-12-04 17:26:11

问题


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 and p.permission in (:permissions)

Any ideas?


回答1:


You can use countDistinct on CriteriaBuilder

criteriaQuery.select(criteriaBuilder.countDistinct(entityRoot))



回答2:


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



回答3:


Use c.distinct(true) on your Query.

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




回答4:


    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()));
    }


来源:https://stackoverflow.com/questions/6197591/how-to-do-a-distinct-count-in-jpa-critera-api

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!