2012-03-30 9 views
9

編集:JPAがこれを表現できないことが判明しました。ソリューションはSQLで書き直すことでした。QueryDSLの特定のフィールドで異なる項目を数える方法

私は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(); 

はもっと良いものはありますか?

+0

JPQLから必要なものを直接指定することはできますか? –

+0

それは私が月曜日の朝にしようとしているものです。私はJPAの下に行って、SQLでクエリを実行することも検討しています。ここでは表現が非常に簡単です。 –

+0

サブクエリとしておそらくサブクエリを使用して、このSQLに相当するものに到達する必要があると思います。サブクエリとして「v(v.make、v.modelによる車両vグループからのselect count(*これは(あるいは、より単純な '' select count(v。のv.make || v.model)はJPQLでは表現可能です。 –

答えて

2

これはQueryDSLの制限ではなく、JPAの制限です。ソリューションはSQLで書き直すことでした。

1

実行可能query.select(q.field.countDistinct())

+2

1つのフィールドではなく、複数のフィールドでdistinctを数えようとしています。 JPAは、1つのフィールドのみでカウントを区別することに限定されています。http://stackoverflow.com/a/37784831/184998 –

関連する問題