In primo luogo, mi permetta di riassumere quello che la specifica JPA 2.0 dice di AVG (vedere paragrafo 4.8.5 aggregazione nelle SELECT clausola per il contenuto completo)
La funzione AVG prende un percorso di campo Stato espressione come argomento e calcola il valore medio del campo di sate sul gruppo. Il campo dello stato deve essere numerico e il risultato è returnd come Double.
Così, dopo una prima lettura, mi aspettavo il seguente frammento di passare:
Query q = em.createQuery("select avg(s.transfusionUnits) from Surgery s");
Double actual = (Double) q.getSingleResult();
assertEquals(2.5d, actual.doubleValue());
ma non ha, mi è stato sempre 2.0
come risultato (un doppio, ma non il risultato atteso).
Quindi ho esaminato il livello di database e mi sono reso conto che la query SQL non stava effettivamente restituendo 2.5
. E in effetti, questo è ciò che la documentazione del mio database dice su AVG:
Il valore medio (medio). Se nessuna riga è selezionata, il risultato è NULL. Gli aggregati sono consentiti solo in istruzioni selezionate. Il valore restituito è dello stesso tipo di dati del parametro.
Mi aspettavo troppo. JPA restituirà il risultato come un doppio, ma non farà alcuna magia. Se la query non restituisce un risultato con la precisione richiesta, non sarà possibile ottenerlo a livello di Java.
Quindi, senza cambiare il tipo di transfusionUnits
, ho dovuto eseguire questa query nativo per ottenere le cose di lavoro:
Query q = em.createNativeQuery("SELECT AVG(CAST(s.transfusionUnits as double)) from Surgery s");
Double actual = (Double) q.getSingleResult();
assertEquals(2.5d, actual.doubleValue());
Aggiornamento: Sembra che alcuni di database (ad esempio MySQL) restituiscono un valore con una parte decimale quando si utilizza AVG su una colonna INT (che ha senso, indipendentemente dal comportamento documentato del database che ho usato qui). Per gli altri database, la versione precedente potrebbe essere gestita con nel "dialetto" (ad esempio vedere HHH-5173 per Hibernate) per evitare problemi di portabilità tra il database quando si utilizza JPQL.
Non funziona per me, sto ricevendo l'errore che dovrebbe esserci) piuttosto che + segno. –
ha funzionato per me con openjpa, sembra essere dipendente dal provider – MarianP