10

编辑:事实证明 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();

有更好的吗?

4

2 回答 2

2

这不是 QueryDSL 限制,而是 JPA 限制。解决方案是用 SQL 重写。

于 2012-10-20T13:34:19.317 回答
2

你可以做query.select(q.field.countDistinct())

于 2016-08-11T20:05:07.570 回答