2012-03-30 26 views
9

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?

+0

Bạn có thể thể hiện những gì bạn cần thông qua JPQL trực tiếp không? –

+0

Đó 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. –

+0

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. –

Trả lời

2

Đây không phải là giới hạn QueryDSL, nhưng là giới hạn JPA. Giải pháp là viết lại trong SQL.

1

Bạn có thể làm query.select(q.field.countDistinct())

+2

Tôi đang cố gắng tính riêng biệt trên nhiều trường, không phải là một trường đơn lẻ. JPA bị giới hạn chỉ tính số hiệu suất riêng biệt trên một trường duy nhất: http://stackoverflow.com/a/37784831/184998 –

Các vấn đề liên quan