web-dev-qa-db-ja.com

Spring Data JPA-結果に複数の集約関数を含むカスタムクエリ

1つのクエリで一連の評価の平均と数を返そうとしていました。ブラウジングで見つけた例に従って、2つのクエリでかなり簡単に管理しました。例えば:

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

しかし、同じクエリで平均とカウントが必要になるとすぐに、問題が発生しました。何時間も実験した結果、これが機能することがわかりましたので、ここで共有しています。お役に立てば幸いです。

1)結果のために新しいクラスが必要でした:

クエリでそのクラスを参照する必要がありました。

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

1つのクエリで、平均評価と評価数が返されるようになりました

12
formica

自分で解決した。

結果を受け取るカスタムクラス:

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

そして

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

ありがとう。

次のように、NPEと休止状態の解析タプルエラーを防止する必要があります。

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