【发布时间】:2012-02-21 12:44:11
【问题描述】:
我是 JPA 的新手,想实现一个通用的 JPA DAO,需要找到查询结果集的行数来实现分页。在网上搜索后,我找不到一种实用的方法来做到这一点。这是很多文章中建议的代码:
public <T> Long findCountByCriteria(CriteriaQuery<?> criteria) {
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Long> countCriteria = builder.createQuery(Long.class);
Root<?> entityRoot = countCriteria.from(criteria.getResultType());
countCriteria.select(builder.count(entityRoot));
countCriteria.where(criteria.getRestriction());
return em.createQuery(countCriteria).getSingleResult();
}
但是,当使用join 时,该代码不起作用。有没有办法使用 JPA Criteria API 计算查询结果集的行数?
更新: 这是创建 CriteriaQuery 的代码:
CriteriaQuery<T> queryDefinition = criteriaBuilder.createQuery(this.entityClass);
Root<T> root = queryDefinition.from(this.entityClass);
在执行查询之前,可能会向根添加一些连接:
public Predicate addPredicate(Root<T> root) {
Predicate predicate = getEntityManager().getCriteriaBuilder().ge(root.join(Entity_.someList).get("id"), 13);
return predicate;
}
生成的异常是这样的:
org.hibernate.hql.ast.QuerySyntaxException:无效路径: 'generatedAlias1.id' [从 entity.Entity 中选择计数(生成的Alias0) 作为 generateAlias0 其中 ( generatedAlias0.id>=13L ) 和 ( (生成的Alias1.id
哪个 generateAlias1 应该在 Entity 上,而 generatedAlias0 应该在我加入的关联上。 请注意,我正确地实现了 Join,因为当我执行没有计数查询的查询时,它执行时没有错误,并且 Join 工作正常,但是当我尝试执行计数查询时它会引发异常。
【问题讨论】:
-
您能告诉我们您是如何定义 CriteriaQuery> 标准
-
@perissf tnx 4 请注意。我检查了那些,但没有帮助我。在我的 JPA 条件查询中使用联接时,我不知道如何获取行数。
-
您仍然没有显示所有代码。您如何为 WHERE 语句生成谓词?连接应该为 WHERE 生成谓词。你遇到了什么错误?
-
@perissf 我在主帖中添加了更多详细信息。
标签: java jpa orm count pagination