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 に答える