首页 > 解决方案 > 如何使用 JPA Criteria 计算查询中的行数?

问题描述

我正在编写一个为 UI 表提供数据的模块,用户可以在其中传递 JPA Criteria 查询。获取数据很好。但是我找不到解决方案来计算查询中的行数以指定表的“长度”。

我想要做的是将查询作为新查询的 FROM 部分中的子查询传递,但我不知道这是否可能与 Criteria.

生成的 SQL 应该是这样的:

SELECT count(1) FROM <user specified query as subquery>

我发现的所有示例都说我应该使用相同的根、相同的连接...等重新创建查询。并更改选择以包含计数,但这比这要复杂得多,而且,如果我这样做,我必须考虑以下内容:如果原始查询包含 group by 子句怎么办,我如何将其复制到新的查询而不在结果中获得多行。

我试过这样做:

    CriteriaQuery countingQuery = criteriaBuilder.createQuery(Long.class);
    Root from = countingQuery.from(userSpecifiedQuery.subquery(entityClass));
    countingQuery.select(criteriaBuilder.count(criteriaBuilder.literal(1L)));

但是没有from接受Subquery作为参数的方法。

该类Subquery具有可以从 中创建 a 的方法correlate,该方法可以用来代替,但我无法弄清楚要传递给该方法的根。RootSubquerycountingQuery.from()correlate

java-doc 说:

/**
 * Create a subquery root correlated to a root of the 
 * enclosing query.
 * @param parentRoot  a root of the containing query
 * @return subquery root
 */

更让我困惑。在我的情况下,“封闭”查询的根不是此方法创建的根吗?(或者也许这种方法和我想的完全不同?)

标签: jpacountsubquerycriteria-api

解决方案


推荐阅读