Chỉnh sửa: nó chỉ ra rằng JPA không thể diễn đạt điều này. Giải pháp là viết lại trong SQL.Cách tính các mục riêng biệt trên các trường cụ thể trong QueryDSL
Tôi đang sử dụng QueryDSL để thực hiện truy vấn tổng hợp trên tập dữ liệu JPA để báo cáo. Tôi không gặp vấn đề gì khi trích xuất dữ liệu báo cáo. Ví dụ:
...
query = query.groupBy(QVehicle.vehicle.make, QVehicle.vehicle.model);
return query.listDistinct(new QMakeModelReportData(
QVehicle.vehicle.make, QVehicle.vehicle.model,
QVehicle.vehicle.make.count()));
Điều này tạo ra danh sách đối tượng DTO của tôi, mỗi đối tượng có mẫu xe, mẫu xe và số lượng xe tạo mô hình đó. Như thế này:
Ford, Focus, 14
Ford, Mondeo, 4
Vauxhall, Astra, 4
Nhưng tôi không thể tính cú pháp đếm số hàng trước khi tôi thực sự thực hiện truy vấn. Cú pháp tôi tưởng tượng là như thế này, mà không tồn tại:
return query.countDistinct(QVehicle.vehicle.make, QVehicle.vehicle.model);
Tôi đã kết thúc với một lựa chọn khá hiệu quả:
return query
.listDistinct(QVehicle.vehicle.make, QVehicle.vehicle.model)
.size();
Có điều gì tốt hơn?
Bạn có thể thể hiện những gì bạn cần thông qua JPQL trực tiếp không? –
Đó là những gì tôi sẽ cố gắng vào sáng thứ Hai. Tôi cũng đang xem xét việc đi bên dưới JPA và thực hiện truy vấn trong SQL, nơi nó rất dễ diễn đạt. –
Tôi nghĩ rằng tôi cần phải đạt được một tương đương của SQL này, có thể sử dụng một truy vấn phụ: 'chọn tổng (đếm) từ (chọn đếm (*) từ nhóm v xe bởi v.make, v.model) làm truy vấn con;' I ' m không chắc chắn điều này (hoặc thậm chí đơn giản hơn 'chọn đếm (khác biệt v.make || v.model) từ xe v;') là rõ ràng trong JPQL. –