Я пишу модуль, который предоставляет данные для таблицы пользовательского интерфейса, где пользователь может передать запрос JPA Criteria. Получение данных в порядке. Однако я не смог найти решение для подсчета строк из запроса, чтобы указать «длину» для таблицы.
Что я хочу сделать, так это передать запрос как подзапрос в части FROM нового запроса, но я не знаю, возможно ли это вообще с критериями.
Результирующий 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-документ говорит:
/**
* Create a subquery root correlated to a root of the
* enclosing query.
* @param parentRoot a root of the containing query
* @return subquery root
*/
Меня это больше смущает. Разве в моем случае корень «охватывающего» запроса не будет корнем, созданным этим методом? (А может, этот метод делает совсем не то, что я думал?)
Select Count(*) From XXX Where XXX.yyy = ...
- person Zorglube   schedule 19.07.2018