2015-08-17 32 views
6

Stavo cercando di restituire una media e il conteggio di un insieme di valutazioni in una query. L'ho gestito abbastanza facilmente in due query seguendo l'esempio che ho trovato durante la navigazione. Per esempio:Spring Data JPA - Query personalizzata con più funzioni di aggregazione nel risultato

@Query("SELECT AVG(rating) from UserVideoRating where videoId=:videoId") 
public double findAverageByVideoId(@Param("videoId") long videoId); 

ma non appena ho voluto una media e un conteggio nella stessa query, cominciarono i problemi. Dopo molte ore di sperimentazione, ho scoperto che questo ha funzionato, quindi lo sto condividendo qui. Spero possa essere d'aiuto.

1) avevo bisogno di una nuova classe per i risultati:

L'ho dovuto fare riferimento a quella classe nella query:

@Query("SELECT new org.magnum.mobilecloud.video.model.AggregateResults(AVG(rating) as rating, COUNT(rating) as TotalRatings) from UserVideoRating where videoId=:videoId") 
public AggregateResults findAvgRatingByVideoId(@Param("videoId") long videoId); 

una query ora ritorna valutazione media e il numero di punteggi

risposta

9

me risolto: classe

personalizzato per ricevere i risultati

public class AggregateResults { 

private final double rating; 

private final int totalRatings; 
    public AggregateResults(double rating, long totalRatings) { 
     this.rating = rating; 
     this.totalRatings = (int) totalRatings; 
    } 

    public double getRating() { 
     return rating; 
    } 

    public int getTotalRatings() { 
     return totalRatings; 
    } 
} 

e

@Query("SELECT new org.magnum.mobilecloud.video.model.AggregateResults(
     AVG(rating) as rating, 
     COUNT(rating) as TotalRatings) 
    FROM UserVideoRating 
    WHERE videoId=:videoId") 
public AggregateResults findAvgRatingByVideoId(@Param("videoId") long videoId); 
+0

Si prega di definire la classe personalizzata – Garry

+0

AggregateResults public class {private finale doppio rating; private final int totalRatings; Public AggregateResults (doppia valutazione, long totalRatings) { this.rating = rating; this.totalRatings = (int) totalRatings; } public double getRating() { indice di rendimento; } public int getTotalRatings() { return totalRatings; } } – formica

+0

grazie ... Si prega di aggiungere questo alla vostra risposta e riguardano – Garry

1

Grazie.

Si dovrebbe evitare che NPE e ibernazione errori di analisi tuple come segue:

public class AggregateResults { 

private final double rating; 
private final int totalRatings; 

public AggregateResults(Double rating, Long totalRatings) { 
    this.rating = rating == null ? 0 : rating; 
    this.totalRatings = totalRatings == null ? 0 : totalRatings.intValue(); 
} 

public double getRating() { 
    return rating; 
} 
public int getTotalRatings() { 
    return totalRatings; 
}} 
+0

Sì, suppongo che AVG() possa restituire null anche se penso che il COUNT() sia 0, se nessuna riga corrisponde. – formica