Как подсчитать отдельные элементы в определенных полях в QueryDSL

Редактировать: оказывается, 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();

Есть ли что-нибудь лучше?

9
задан Adrian Cox 20 April 2012 в 13:02
поделиться