2012-03-30 20 views
9

Editar: resulta que JPA no puede expresar esto. La solución fue reescribir en SQL.Cómo contar elementos distintos en campos específicos en QueryDSL

Estoy usando QueryDSL para realizar una consulta agregada en un conjunto de datos JPA para la generación de informes. No tengo problemas para extraer los datos del informe. Por ejemplo:

... 
query = query.groupBy(QVehicle.vehicle.make, QVehicle.vehicle.model); 
return query.listDistinct(new QMakeModelReportData(
      QVehicle.vehicle.make, QVehicle.vehicle.model, 
      QVehicle.vehicle.make.count())); 

Esto produce una lista de mi objeto DTO, cada uno de los cuales contiene una marca del vehículo, modelo del vehículo, y el recuento de vehículos de ese modelo de maquillaje. De esta manera:

Ford, Focus, 14 
    Ford, Mondeo, 4 
    Vauxhall, Astra, 4 

Pero no puedo averiguar la sintaxis para contar el número de filas antes de que se ejecute la consulta. La sintaxis imagino es como este, que no existe:

return query.countDistinct(QVehicle.vehicle.make, QVehicle.vehicle.model); 

he terminado con una opción bastante ineficiente:

return query 
    .listDistinct(QVehicle.vehicle.make, QVehicle.vehicle.model) 
    .size(); 

¿Hay algo mejor?

+0

¿Es capaz de expresar lo que necesita a través JPQL directamente? –

+0

Eso es lo que intentaré el lunes por la mañana. También considero ir debajo de JPA y hacer la consulta en SQL, donde es muy fácil de expresar. –

+0

Creo que necesito llegar a un equivalente de este SQL, probablemente usando una subconsulta: 'select sum (count) from (select count (*) from vehicle v group by v.make, v.model) como subconsulta;' I ' m no estoy seguro de que esto (o el aún más simple 'select count (distinto v.make || v.model) del vehículo v; ') se pueda expresar en JPQL. –

Respuesta

2

Esto no es una limitación de QueryDSL, sino una limitación de JPA. La solución fue reescribir en SQL.

1

Usted puede hacer query.select(q.field.countDistinct())

+2

Estoy tratando de contar distinto en múltiples campos, ni un solo campo. JPA se limita a realizar el recuento distinto en un único campo solamente: http://stackoverflow.com/a/37784831/184998 –

Cuestiones relacionadas