44
55import org .springframework .data .jpa .repository .JpaRepository ;
66import org .springframework .data .jpa .repository .Query ;
7+ import org .springframework .data .repository .query .Param ;
78
89import com .threestar .trainus .domain .lesson .admin .entity .Category ;
910import com .threestar .trainus .domain .metadata .entity .ProfileMetadata ;
1011import com .threestar .trainus .domain .ranking .dto .RankingData ;
1112
12- import io .lettuce .core .dynamic .annotation .Param ;
13-
1413public interface RankingRepository extends JpaRepository <ProfileMetadata , Long > {
1514
1615 @ Query ("""
1716 SELECT pm.user.id as userId,
18- pm.user.nickname as userNickname,
19- pm.reviewCount as reviewCount,
20- pm.rating as rating,
21- p.profileImage as profileImage
17+ pm.user.nickname as userNickname,
18+ pm.reviewCount as reviewCount,
19+ pm.rating as rating,
20+ p.profileImage as profileImage
2221 FROM ProfileMetadata pm
2322 JOIN pm.user u
2423 LEFT JOIN Profile p ON p.user = u
25- WHERE pm.reviewCount >= 10
24+ WHERE pm.reviewCount >= 20
2625 ORDER BY (
27- (pm.rating / 5.0) * 0.5 +
28- (LEAST(pm.reviewCount, 100) / 100.0) * 0.5
26+ (pm.rating / 5.0) * 0.5 +
27+ (LEAST(pm.reviewCount, 100) / 100.0) * 0.5
2928 ) DESC
3029 LIMIT 10
3130 """ )
3231 List <RankingData > findTopRankings ();
3332
3433 @ Query ("""
3534 SELECT r.reviewee.id as userId,
36- r.reviewee.nickname as userNickname,
37- CAST(COUNT(r.reviewId) AS INTEGER) as reviewCount,
38- CAST (AVG(r.rating) AS FLOAT) as rating,
39- p.profileImage as profileImage
40- FROM Review r
41- JOIN r.lesson l
42- JOIN r.reviewee u
43- LEFT JOIN Profile p ON p.user = u
44- WHERE l.category = :category
45- AND r.deletedAt IS NULL
46- GROUP BY r.reviewee.id, r.reviewee.nickname, p.profileImage
47- HAVING COUNT(r.reviewId) >= 10
48- ORDER BY (
49- (AVG(r.rating) / 5.0) * 0.5 +
50- (LEAST(COUNT(r.reviewId), 100) / 100.0) * 0.5
51- ) DESC
52- LIMIT 10
35+ r.reviewee.nickname as userNickname,
36+ CAST(COUNT(r.reviewId) AS INTEGER) as reviewCount,
37+ AST (AVG(r.rating) AS FLOAT) as rating,
38+ p.profileImage as profileImage
39+ FROM Review r
40+ JOIN r.lesson l
41+ JOIN r.reviewee u
42+ LEFT JOIN Profile p ON p.user = u
43+ WHERE l.category = :category
44+ AND r.deletedAt IS NULL
45+ GROUP BY r.reviewee.id, r.reviewee.nickname, p.profileImage
46+ HAVING COUNT(r.reviewId) >= 20
47+ ORDER BY (
48+ (AVG(r.rating) / 5.0) * 0.5 +
49+ (LEAST(COUNT(r.reviewId), 100) / 100.0) * 0.5
50+ ) DESC
51+ LIMIT 10
5352 """ )
5453 List <RankingData > findTopRankingsByCategory (@ Param ("category" ) Category category );
55-
56- }
54+ }
0 commit comments