Редактировать: оказывается, JPA не может выразить это. Решением было переписать на SQL.
Я использую QueryDSL для выполнения агрегированного запроса к набору данных JPA для составления отчетов. У меня нет проблем с извлечением данных отчета. Например:
...
query = query.groupBy(QVehicle.vehicle.make, QVehicle.vehicle.model);
return query.listDistinct(new QMakeModelReportData(
QVehicle.vehicle.make, QVehicle.vehicle.model,
QVehicle.vehicle.make.count()));
Это создает список моих объектов DTO, каждый из которых содержит марку транспортного средства, модель транспортного средства и количество транспортных средств этой модели. Вот так:
Ford, Focus, 14
Ford, Mondeo, 4
Vauxhall, Astra, 4
Но я не могу разработать синтаксис для подсчета количества строк до фактического выполнения запроса. Синтаксис, который я себе представляю, такой, которого не существует:
return query.countDistinct(QVehicle.vehicle.make, QVehicle.vehicle.model);
Я получил довольно неэффективный вариант:
return query
.listDistinct(QVehicle.vehicle.make, QVehicle.vehicle.model)
.size();
Есть ли что-нибудь лучше?