如何使用JPA条件对查询中的行进行计数?

时间:2018-07-05 09:32:10

标签: jpa count subquery criteria-api

我正在编写一个为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类具有correlate方法,该方法将从Root创建一个Subquery,该方法可以代替countingQuery.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
 */

这让我更加困惑。在我的案例中,“封闭”查询的根目录不是由该方法创建的根目录吗? (或者也许这种方法与我的想法完全不同?)

0 个答案:

没有答案