【问题标题】:How to do a distinct count in JPA critera API?如何在 JPA 标准 API 中进行不同的计数?
【发布时间】:2011-09-06 01:22:02
【问题描述】:

我想这样做,但使用标准 API:

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

有什么想法吗?

【问题讨论】:

    标签: java hibernate jpa criteria-api


    【解决方案1】:

    在您的查询上使用 c.distinct(true)。

    更多示例请参见http://relation.to/Bloggers/ATypesafeCriteriaQueryAPIForJPA

    【讨论】:

    • 如果您能给我提供一个如何在我的特定情况下执行此操作的示例,我将不胜感激,因为我在标准 api 中使用了 distinct,但由于某种原因,这个用例对我不起作用.
    【解决方案2】:

    像这样?

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

    【讨论】:

    • 那不是 JPA,但问题是
    • 哎呀,被hibernate标签误导了,tx
    【解决方案3】:

    您可以在 CriteriaBuilder 上使用 countDistinct

    criteriaQuery.select(criteriaBuilder.countDistinct(entityRoot))
    

    【讨论】:

      【解决方案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();
      
      
          }
      

      有了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,
      猜你喜欢
      • 2018-08-22
      • 2019-07-13
      • 2018-11-06
      • 2012-09-25
      • 1970-01-01
      • 2017-04-18
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      相关资源
      最近更新 更多