44
55import org .ezcode .codetest .domain .problem .model .ProblemSearchCondition ;
66import org .ezcode .codetest .domain .problem .model .entity .Problem ;
7+ import org .ezcode .codetest .domain .problem .model .entity .QCategory ;
78import org .ezcode .codetest .domain .problem .model .entity .QProblem ;
9+ import org .ezcode .codetest .domain .problem .model .entity .QProblemCategory ;
810import org .ezcode .codetest .domain .problem .model .enums .Difficulty ;
911import org .springframework .data .domain .Page ;
1012import org .springframework .data .domain .PageImpl ;
1113import org .springframework .data .domain .Pageable ;
1214import org .springframework .stereotype .Repository ;
1315
1416import com .querydsl .core .BooleanBuilder ;
17+ import com .querydsl .jpa .impl .JPAQuery ;
1518import com .querydsl .jpa .impl .JPAQueryFactory ;
1619
1720import lombok .RequiredArgsConstructor ;
@@ -26,32 +29,43 @@ public class ProblemQueryRepositoryImpl implements ProblemRepositoryCustom {
2629 public Page <Problem > searchByCondition (Pageable pageable , ProblemSearchCondition searchCondition ) {
2730
2831 QProblem problem = QProblem .problem ;
32+ QProblemCategory problemCategory = QProblemCategory .problemCategory ;
33+ QCategory category = QCategory .category ;
2934
3035 // where 조건을 깔끔 하게 조립
3136 BooleanBuilder builder = new BooleanBuilder ();
3237
3338 builder .and (problem .isDeleted .isFalse ());
3439
35- /*
36- if(searchCondition.category() != null) {
37- builder.and(problem.categories.contains(searchCondition.category()));
40+ JPAQuery <Problem > query = jpaQueryFactory
41+ .selectDistinct (problem )
42+ .from (problem )
43+ .leftJoin (problemCategory ).on (problem .eq (problemCategory .problem ))
44+ .leftJoin (problemCategory .category , category )
45+ .where (builder );
46+
47+ // 카테고리 필터링
48+ if (searchCondition .category () != null ) {
49+ builder .and (category .code .eq (searchCondition .category ())
50+ .or (category .korName .eq (searchCondition .category ())));
3851 }
39- */
52+
53+ // 난이도 필터링
4054 if (searchCondition .difficulty () != null ) {
4155 builder .and (problem .difficulty .eq (Difficulty .valueOf (searchCondition .difficulty ())));
4256 }
4357
44- List <Problem > content = jpaQueryFactory
45- .selectFrom (problem )
46- .where (builder )
58+ List <Problem > content = query
4759 .offset (pageable .getOffset ())
4860 .limit (pageable .getPageSize ())
4961 .orderBy (problem .createdAt .desc ())
5062 .fetch ();
5163
5264 Long total = jpaQueryFactory
53- .select (problem .count ())
65+ .select (problem .countDistinct ())
5466 .from (problem )
67+ .leftJoin (problemCategory ).on (problem .eq (problemCategory .problem ))
68+ .leftJoin (problemCategory .category , category )
5569 .where (builder )
5670 .fetchOne ();
5771
0 commit comments