我正在尝试实现以下便捷方法:

/**
 * Counts the number of results of a search.
 * @param criteria The criteria for the query.
 * @return The number of results of the query.
 */
public int findCountByCriteria(CriteriaQuery<?> criteria);


在Hibernate中,这是通过以下方式完成的:

criteria.setProjection(Projections.rowCount());


JPA中的上述内容等同于什么?我发现了许多简单的计数示例,但是没有一个示例使用CriteriaQuery来确定行计数。

编辑:

不幸的是,我发现@Pascal的答案不是正确的答案。这个问题非常细微,只有在使用联接时才会出现:

// Same query, but readable:
// SELECT *
// FROM Brain b
// WHERE b.iq = 170

CriteriaQuery<Person> query = cb.createQuery(Person.class);
Root<Person> root = query.from(Person.class);
Join<Object, Object> brainJoin = root.join("brain");
Predicate iqPredicate = cb.equal(brainJoin.<Integer>get("iq"), 170);
query.select(root).where(iqPredicate);


调用findCountByCriteria(query)时,它死于以下异常:

org.hibernate.hql.ast.QuerySyntaxException: Invalid path: 'generatedAlias1.iq' [select count(generatedAlias0) from xxx.tests.person.dom.Person as generatedAlias0 where generatedAlias1.iq=170]


还有其他方法可以提供这种CountByCriteria方法吗?

最佳答案

我编写了一个实用程序类JDAL JpaUtils来做到这一点:


计算结果:Long count = JpaUtils.count(em, criteriaQuery);
复制CriteriaQueries:JpaUtils.copyCriteria(em, criteriaQueryFrom, criteriaQueryTo);
获取计数标准:CriteriaQuery<Long> countCriteria = JpaUtils.countCriteria(em, criteria)


等等...

如果您对源代码感兴趣,请参见JpaUtils.java

07-28 09:58