Как я могу подсчитать количество групп результатов в QueryDSL?

Как я могу реализовать количество групп в QueryDSL (на Java)?

Задний план

Я реализую поисковый поиск по таблице, где я хочу сгруппировать результаты перед их возвратом.

В дополнение к обычному запросу LIMIT x OFFSET y , я также хочу получить общее количество строк.

Это (упрощенный) SQL-запрос для одной страницы:

 SELECT x, y, MAX(z) FROM tasks WHERE y > 10 GROUP BY x, y LIMIT 10 OFFSET 0 

Чтобы получить количество строк, я попытался использовать наивный COUNT(*) вместо x, y, MAX(z) следующим образом:

 SELECT COUNT(x) FROM tasks WHERE y > 10 GROUP BY x, y 

К сожалению, это не создает одну строку с количеством групп, возвращаемых предыдущим запросом, но по одной строке для каждой группы, каждая с количеством строк, которые были сгруппированы вместе – как обычно для функций агрегации, COUNT меняет свой смысл, когда GROUP BY присутствует. (По крайней мере, в Postgresql, что мы здесь используем.)

Мы можем получить общее количество, используя первый оператор SELECT в качестве подзадачи в предложении from:

 SELECT COUNT(*) FROM ( SELECT x, y, MAX(z) FROM tasks WHERE y > 10 GROUP BY x, y ) 

Теперь сложная часть: как мы можем это сделать в JPQL и / или QueryDSL?

Первые два запроса были получены с помощью следующего кода:

 QTask qTask = QTask.task; Expression<?>[] groupExps = { qTask.x, qTask.y }; Predicate predicate = qTask.y.gt(10); List<Result> results = getQueryDSL().createQuery() .from(qTask) .where(predicate) .groupBy(groupExps) .offset(0) .limit(10) .list(ConstructorExpression.create(Result.class, qTask.x qTask.y, qTask.z.max())) Long total = getQuerydsl().createQuery() .from(qTask) .where(predicate) .groupBy(groupExps) .singleResult(qTask.x.count()); 

Похоже, JPA / JPQL не поддерживает подзапросы, отличные от предложений WHERE или HAVING , т. Е. Они не возможны в предложении FROM. Похоже, что причиной этого является то, что QueryDSL для JPA тоже не поддерживает их.

Есть ли способ переписать это утверждение или как-то обойти это ограничение?

Я не могу помочь вам с jpa и jql, но это интересная проблема SQL …

Что такое RDMS? Нижеследующее работает в MS SQL Server. Вы можете использовать конкатенацию, различать и подсчитывать, чтобы определить, сколько уникальных значений есть при объединении x и y. Это должно быть такое же количество строк, когда вы группируете по x, y.

 select count(distinct CAST(x as char(10)) + CAST(y as char(10))) from tasks;