Spring Data JPA - 结果中包含多个聚合函数的自定义查询

for*_*ica 11 java spring jpa aggregate-functions spring-data

我试图在一个查询中返回一组平均值和一组评级.在我发现浏览的示例之后,我在两个查询中相当容易地管理它.例如:

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

但是只要我想在同一个查询中获得平均值和一个计数,麻烦就开始了.经过几个小时的实验,我发现这很有效,所以我在这里分享.我希望它有所帮助.

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);
Run Code Online (Sandbox Code Playgroud)

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

for*_*ica 17

解决了自己.

自定义类来接收结果:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

@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);
Run Code Online (Sandbox Code Playgroud)