Spring Data JPA-在结果中具有多个聚合函数的自定义查询

Spring Data JPA-在结果中具有多个聚合函数的自定义查询

问题描述:

我试图在一个查询中返回一组评分的平均值和计数. 在发现浏览的示例之后,我通过两个查询非常轻松地对其进行了管理.例如:

I was trying to return an average and count of a set of ratings in one query. I managed it fairly easily in two queries following the example I found browsing. For example:

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

但是,只要我想在同一查询中获得平均值和计数,麻烦就开始了.经过数小时的试验,我发现此方法有效,因此我在这里分享.希望对您有帮助.

but as soon as I wanted an average and a count in the same query, the trouble started. After many hours experimenting, I found this worked, so I am sharing it here. I hope it helps.

1)我需要一个新的班级来获得结果:

1) I needed a new class for the results:

我必须在查询中引用该类:

The I had to reference that class in the 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);

一个查询现在返回平均评分和评分计数

One query now returns average rating and count of ratings

解决了自己.

自定义类接收结果:

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