如何计算QueryDSL中特定字段的不同项目

时间:2012-03-30 13:32:07

标签: java jpa-2.0 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();

有什么更好的吗?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

您可以执行query.select(q.field.countDistinct())