Edit: es stellt sich heraus, dass JPA dies nicht ausdrücken kann. Die Lösung sollte in SQL umgeschrieben werden.So zählen Sie bestimmte Elemente in bestimmten Feldern in QueryDSL
Ich verwende QueryDSL, um eine zusammengefasste Abfrage für eine JPA-Datei für die Berichterstattung durchzuführen. Ich habe kein Problem, die Berichtsdaten zu extrahieren. Zum Beispiel:
...
query = query.groupBy(QVehicle.vehicle.make, QVehicle.vehicle.model);
return query.listDistinct(new QMakeModelReportData(
QVehicle.vehicle.make, QVehicle.vehicle.model,
QVehicle.vehicle.make.count()));
Dies erzeugt eine Liste meiner DTO-Objekt, von denen jede eine Fahrzeugmarke, Fahrzeugmodell enthält, und die Anzahl der Fahrzeuge dieser Marke Modell. Wie folgt aus:
Ford, Focus, 14
Ford, Mondeo, 4
Vauxhall, Astra, 4
Aber ich kann nicht die Syntax arbeiten, um die Anzahl der Zeilen zu zählen, bevor ich die Abfrage tatsächlich auszuführen. Die Syntax Ich stelle mir ist wie diese, die es nicht gibt:
return query.countDistinct(QVehicle.vehicle.make, QVehicle.vehicle.model);
Ich habe mit einer ziemlich ineffizient Option endete:
return query
.listDistinct(QVehicle.vehicle.make, QVehicle.vehicle.model)
.size();
Gibt es etwas Schöneres?
Sind Sie in der Lage zu sagen, was Sie über JPQL direkt benötigen? –
Das werde ich Montagmorgen versuchen. Ich überlege auch, unter JPA zu gehen und die Abfrage in SQL durchzuführen, wo es sehr einfach auszudrücken ist. –
Ich denke, ich muss ein Äquivalent zu dieser SQL erreichen, wahrscheinlich mit einer Unterabfrage: 'select sum (count) from (wähle count (*) aus v-v-gruppe von v.make, v.model) als Unterabfrage;' I ' Ich bin nicht sicher, dass dies (oder die noch einfachere 'select count (distinct v.make || v.model) von vehicle v;') in JPQL ausgedrückt werden kann. –