代码之家  ›  专栏  ›  技术社区  ›  Tim

在jpa条件api查询中使用countDistinct的示例

  •  6
  • Tim  · 技术社区  · 15 年前

    我很难理解如何表示以下jpql查询:

    SELECT count(e) FROM Foo e
    

    使用标准API。我想说的是:

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Foo> c = cb.createQuery(Foo.class);
    Root<Foo> f = c.from(Foo.class);
    c.select(cb.count(f));
    

    但这不管用。我也试过:

    c.select(cb.count(f.get("id"));
    

    这是给JPA2的,日食线。

    2 回复  |  直到 10 年前
        1
  •  11
  •   cdmckay    14 年前

    试试这个,这是使用Hibernate3.5.1:

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Long> c = cb.createQuery(Long.class);
    Root<Foo> f = c.from(Foo.class);
    c.select(cb.count(f));
    int count = em.createQuery(c).getSingleResult().intValue();
    
        2
  •  5
  •   AlexS    13 年前

    这是一个很老的问题,但为了完整起见,这里有一个简单的补充:

    标题中提到了“使用countDistinct”,因此这里应该提到countDistinct:

    CriteriaBuilder critBuilder = entityManager.getCriteriaBuilder();
    CriteriaQuery<Long> critQuery = criteriaBuilder.createQuery(Long.class);
    Root<Foo> root = critQuery.from(Foo.class);
    
    critQuery.select(critBuilder.countDistinct(root));
    int count = entityManager.createQuery(critQuery).getSingleResult().intValue();
    

    如果不想计算双倍行,这一点很重要。 如果要避免结果列表中的行加倍,则必须使用:

    CriteriaBuilder critBuilder = entityManager.getCriteriaBuilder();
    CriteriaQuery<Long> critQuery = criteriaBuilder.createQuery(Long.class);
    Root<Foo> root = critQuery.from(Foo.class);
    
    critQuery.select(root).distinct(true);
    List<Foo> result = entityManager.createQuery(critQuery).getResultList();