2012-03-30 19 views
9

Modifica: risulta che JPA non può esprimere questo. La soluzione era di riscrivere in SQL.Come contare elementi distinti su campi specifici in QueryDSL

Sto utilizzando QueryDSL per eseguire una query aggregata su un set di dati JPA per la creazione di report. Non ho problemi a estrarre i dati del report. Per esempio:

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

Questo produce un elenco di mio oggetto DTO, ognuno dei quali contiene una marca del veicolo, modello di veicolo e il numero di veicoli di quel modello marca. Come questo:

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

Ma non riesco a capire la sintassi per contare il numero di righe prima che io in realtà eseguire la query. La sintassi Immagino che è come questo, che non esiste:

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

ho finito con una scelta piuttosto inefficiente:

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

C'è qualcosa di meglio?

+0

si è in grado di esprimere ciò che è necessario tramite JPQL direttamente? –

+0

Questo è quello che proverò lunedì mattina. Sto anche pensando di andare sotto JPA e fare la query in SQL, dove è molto facile da esprimere. –

+0

Penso di aver bisogno di raggiungere un equivalente di questo SQL, probabilmente usando una subquery: 'selezionare sum (count) da (select count (*) dal veicolo v group per v.make, v.model) come subquery;' I ' Non sono sicuro che questo (o il più semplice conteggio di selezione (distinto v.make || v.model) dal veicolo v; ') sia espresso in JPQL. –

risposta

2

Questa non è una limitazione di QueryDSL, ma una limitazione JPA. La soluzione era di riscrivere in SQL.

1

Si può fare query.select(q.field.countDistinct())

+2

Sto tentando di contare distinti su più campi, non su un singolo campo. JPA è limitato a eseguire il conteggio distinto solo su un singolo campo: http://stackoverflow.com/a/37784831/184998 –

Problemi correlati