Как считать строки в запросе с критериями JPA? - PullRequest
0 голосов
/ 05 июля 2018

Я пишу модуль, который предоставляет данные для таблицы пользовательского интерфейса, где пользователь может передать запрос 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 sais:

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

Это смущает меня больше. Разве корень «вложенного» запроса в моем случае не был бы корнем, созданным этим методом? (Или, может быть, этот метод делает что-то совершенно другое, чем я думал?)

...