JPA 2.0:计数任意CriteriaQuery? [英] JPA 2.0: count for arbitrary CriteriaQuery?

查看:212
本文介绍了JPA 2.0:计数任意CriteriaQuery?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试实现以下便利方法:

  / ** 
*计算结果数的搜索。
* @param criteria查询的条件。
* @return查询的结果数。
* /
public int findCountByCriteria(CriteriaQuery<?> criteria);

在Hibernate中,这是通过

  criteria.setProjection(Projections.rowCount()); 

在JPA中相当于上述什么?我发现很多简单的计数示例,但没有一个使用CriteriaQuery的行计数应该确定。



EDIT:



我不幸发现@ Pascal的回答不是正确的。该问题非常微妙,只有当您使用连接时才显示:

  //相同的查询,但可读:
// 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:无效的路径:'generatedAlias1.iq'[select count(generatedAlias0)from xxx.tests.person.dom.Person as generatedAlias0 where generatedAlias1.iq = 170] 

是否有其他方法提供 CountByCriteria 方法?

解决方案

p>我写了一个实用程序类, JDAL JpaUtils来做:




  • 计数结果:长计数= JpaUtils.count(em,criteriaQuery);

  • copy CriteriaQueries: JpaUtils.copyCriteria(em,criteriaQueryFrom,criteriaQueryTo);

  • 获取计数条件: CriteriaQuery< Long> countCriteria = JpaUtils.countCriteria(em,criteria)



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


I am trying to implement the following convenience method:

/**
 * 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);

In Hibernate, this is done by

criteria.setProjection(Projections.rowCount());

What is the equivalent to the above in JPA? I found numerous simple count examples, but none of them made use of a CriteriaQuery whose row count should be determined.

EDIT:

I unfortunately found out that @Pascal's answer is not the correct one. The problem is very subtle and only shows up when you use joins:

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

When calling findCountByCriteria(query), it dies with the following exception:

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

Is there any other way to provide such a CountByCriteria method?

解决方案

I wrote a utility class, JDAL JpaUtils to do it:

  • count results: Long count = JpaUtils.count(em, criteriaQuery);
  • copy CriteriaQueries: JpaUtils.copyCriteria(em, criteriaQueryFrom, criteriaQueryTo);
  • get count criteria: CriteriaQuery<Long> countCriteria = JpaUtils.countCriteria(em, criteria)

and so on...

If you are interested in the source code, see JpaUtils.java

这篇关于JPA 2.0:计数任意CriteriaQuery?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆