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

有更好的吗?

最佳答案

这不是QueryDSL限制,而是JPA限制。解决的办法是用SQL重写。

关于java - 如何计算QueryDSL中特定字段上的不同项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9943992/

10-10 19:27