我正在编写一个为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
*/
这让我更加困惑。在我的案例中,“封闭”查询的根目录不是由该方法创建的根目录吗? (或者也许这种方法与我的想法完全不同?)