Spring Data JPA - Benutzerdefinierte Abfrage mit mehreren Aggregatfunktionen in Folge
Ich war versucht, zurück Durchschnitt und die Anzahl der eine Reihe von Bewertungen, die in einer Abfrage an.
Ich schaffte es relativ leicht in zwei Abfragen nach dem Beispiel fand ich beim stöbern. Zum Beispiel:
@Query("SELECT AVG(rating) from UserVideoRating where videoId=:videoId")
public double findAverageByVideoId(@Param("videoId") long videoId);
aber so schnell, wie ich wollte, eine Durchschnittliche und eine Zählung in der gleichen Abfrage, begannen die Probleme. Nach vielen Stunden Experimentieren, habe ich gefunden, das hat funktioniert, so Teile ich es hier. Ich hoffe, es hilft.
1) ich brauchte eine neue Klasse für die Ergebnisse:
Den hatte ich auf die Klasse in der Abfrage:
@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);
Einer Abfrage nun zurück Durchschnittliche Bewertung und Anzahl der Bewertungen
InformationsquelleAutor formica | 2015-08-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gelöst mich.
Benutzerdefinierte Klasse, um Ergebnisse zu erhalten:
und
public class AggregateResults { private final double Bewertung; private final int totalRatings; public AggregateResults(double rating, lange totalRatings) { dieses.Bewertung = Bewertung;.totalRatings = (int) totalRatings; } public double getRating() { return Bewertung; } public int getTotalRatings() { return totalRatings; } }
danke...Bitte fügen Sie diese auf Ihre Antwort und beziehen sich
Ist Ihre benutzerdefinierte Klasse markiert als "Entität"? Ich habe Fehler "entity hat keine primary key-Attribut definiert"
Sie müssen (at)Person gegen die Klassen, die Karte zu den Tabellen, ja, aber nicht der Brauch, Ergebnis Klasse. Dein Fehler klingt nach einem Problem mit der Klasse zugeordnet, zu der db-Tabelle. Sie müssen eine Spalte mit Tags (at)Id irgendwo in die Klasse. Zum Beispiel: (an)Id (at)GeneratedValue(strategy = GenerationType.AUTO) private long id; Sorry, der Dialog wird nicht lassen Sie mich geben Sie "at" - Zeichen
InformationsquelleAutor formica
Dank.
Sollte verhindert werden, dass NPEs und Ruhezustand analysieren-Tupel Fehler wie folgenden :
InformationsquelleAutor kCH