(feat) How to get average score
β get average score
score is in review table get all reviews of a movie, set it in reviewList for each reviewList, get score and add.
sum()
then, get size of reviewList average= sum of review scores / size of reviewList
π’ get average score
1
2
int scoreSum= reviewList.stream().mapToInt(Review::getScore).sum();
int numberOfReviews= reviewList.size();
π’ Final Code
μ¬λ¬λ² μ¬μ©ν΄μ λ€λ₯Έ λ©μλμμ ꡬν
1
2
3
4
5
6
7
8
private double caculateScore(List<Review> reviewList){
//score(review) λ€ λν΄μ / number of review
int scoreSum= reviewList.stream().mapToInt(Review::getScore).sum();
int numberOfReviews=reviewList.size();
double scoreAvg= (double) scoreSum/numberOfReviews;
double formattedScoreAvg= Math.round(scoreAvg+10.0)/10.0;
return scoreAvg;
}
π’ Cleaner Code
κ°μ λ©μλ λ΄μμ ꡬν π‘ λλκΈ° ν λλ νμ λλλ μκ° 0μ΄ λμ§ μλλ‘ μ‘°μ¬ν΄μΌ νλ€.
1
2
3
4
5
6
7
8
9
10
11
12
Page<Movie> moviePage= movieJpa.findAll(pageable);
for(Movie movie: moviePage){
//scoreAvg
List<Review> reviewList= reviewJpa.findByMovieId(movie.getMovieId());
int scoreSum= reviewList.stream().map(Review::getScore).mapToInt(Integer::intValue).sum();
int countReview= reviewList.size();
if(countReview == 0 )throw new NotFoundException("There are no reviews for this movie"); //λλλ μ 0 β
double scoreAvg= (double) scoreSum / countReview * 100;
movie.setScoreAvg(scoreAvg);
movieJpa.save(movie);
}
π’ JPAμμ ꡬνλ λ°©λ²
movie tableμμ score_avgλΌλ fieldμμ
λ°λΌμ JPAμμ ꡬν΄μ movie tableμμ score_avgλ₯Ό update
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Repository
public interface MovieJpa extends JpaRepository<Movie, Integer> {
@Transactional
@Modifying
@Query(
value = "UPDATE movie AS A " +
"INNER JOIN (SELECT movie_id, (count(score) / sum(score)) AS SCORE_AVG " +
" FROM review group by movie_id) AS B ON A.movie_id = B.movie_id " +
" SET A.score_avg = B.SCORE_AVG "
, nativeQuery = true)
void updateScoreAvg();
Page<Movie> findAll(Pageable pageable);
}
This post is licensed under CC BY 4.0 by the author.