orm - JPA 2.0 : count for arbitrary CriteriaQuery?

标签 orm jpa count jpa-2.0 criteria-api

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

/**
 * 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);
  • 复制条件查询:JpaUtils.copyCriteria(em, criteriaQueryFrom, criteriaQueryTo);
  • 获取计数标准:CriteriaQuery<Long> countCriteria = JpaUtils.countCriteria(em, criteria)

等等...

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

关于orm - JPA 2.0 : count for arbitrary CriteriaQuery?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3997587/

相关文章:

java - 使用hibernate读取大量数据时OutOfMemory

java - oracle 中数字的类似操作问题

java - 事务和分离对象 JPA

mysql - 将 6 个项目加在一起得出总数,但不要将它们的值加在一起

c# - 性能:List.Count 与检查存储变量

database - 如何在 ORM 中使用多语言数据库模式?

hibernate - Hibernate/ColdFusion ORM 中的连续发票号?

java - 我可以将 Realm 用作 postgres ORM 吗?

java - 如何修改使用 jhipster 生成的现有实体?

sql - 插入查询后的行数和选择查询的行数