Как посчитать отдельные элементы в определенных полях в QueryDSL - PullRequest
9 голосов
/ 30 марта 2012

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

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

Ответы [ 2 ]

2 голосов
/ 20 октября 2012

Это не ограничение QueryDSL, а ограничение JPA.Решением было переписать на SQL.

1 голос
/ 11 августа 2016

Вы можете сделать query.select(q.field.countDistinct())

...