2015-08-17 3 views
6

Ich habe versucht, einen Durchschnitt und die Anzahl einer Reihe von Bewertungen in einer Abfrage zurückzugeben. Ich schaffte es ziemlich einfach in zwei Abfragen nach dem Beispiel, das ich beim Browsen fand. Zum Beispiel:Spring Data JPA - Benutzerdefinierte Abfrage mit mehreren Aggregatfunktionen in Ergebnis

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

aber sobald ich eine mittlere und eine Zählung in der gleichen Abfrage wollte, begann der Ärger. Nach vielen Stunden des Experimentierens fand ich, dass das funktionierte, also teile ich es hier. Ich hoffe, es hilft.

1) brauchte ich eine neue Klasse für die Ergebnisse:

Die ich in der Abfrage, die Klasse zu verweisen hatte:

@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); 

Eine Abfrage gibt jetzt durchschnittliche Bewertung und Anzahl der Bewertungen

Antwort

9

Gelöst mich:

Individuelle Klasse Ergebnisse erhalten

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; 
    } 
} 

und

@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

Bitte definieren Sie Ihre eigene Klasse – Garry

+0

public class AggregateResults {private final Doppel Bewertung; private endgültige int totalRatings; public AggregateResults (doppelte Bewertung, lange totalRatings) { this.rating = rating; this.totalRatings = (int) totalRatings; } öffentliche doppelte getRating() { Rückgesprächsbewertung; } public int getTotalRatings() { Rückgabe gesamtRaten; } } – formica

+0

danke ... Bitte fügen Sie dies zu Ihrer Antwort und beziehen sich – Garry

1

Dank.

Sie sollten NPE verhindern und Parsing Tupel Fehler wie folgt überwintern:

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

Ja, ich denke, AVG() könnte null zurückgeben, obwohl ich denke, dass COUNT() 0 wäre, wenn keine Zeilen übereinstimmen. – formica