Я пишу модуль, который предоставляет данные для таблицы пользовательского интерфейса, где пользователь может передать запрос 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
*/
Это смущает меня больше. Разве корень «вложенного» запроса в моем случае не был бы корнем, созданным этим методом? (Или, может быть, этот метод делает что-то совершенно другое, чем я думал?)