코딩하는 털보

21.11.23 TIL 본문

Diary/Today I Learned

21.11.23 TIL

이정인 2021. 11. 25. 23:57

오늘의 삽질

QueryDsl 사용하기.

QueryDsl 관련 의존성을 추가하고
기존 리포지토리가 상속할 QueryDsl 인터페이스와 그 구현체 추가.

public interface RecommendationRepositoryCustom {
    List<Recommendation> searchByNumber(int number);
}
@re
public class RecommendationRepositoryImpl implements RecommendationRepositoryCustom {

    private final JPAQueryFactory queryFactory;

    public RecommendationRepositoryImpl(EntityManager em) {
        this.queryFactory = new JPAQueryFactory(em);
    }

    @Override
    public List<Recommendation> searchByNumber(int number) {
        return queryFactory
                .selectFrom(recommendation)
                .join(recommendation.user, user).fetchJoin()
                .where(recommendation.number.eq(number))
                .fetch();
    }
}

시행착오

양방향 관계 매핑이 아니고 관계의 주인이 아니라면 join에서 on절을 생략하지 말자.
정렬이든 역정렬이든 .acs(), .desc() 둘 중 하나로 끝내서 표현해줘야 한다.

    @Override
    public List<User> searchTop10ByCategory(Category category) {
        return queryFactory
                .selectFrom(user)
                .join(completedHabit)
                .on(completedHabit.user.eq(user))
                .where(categoryEq(category), user.disabled.isFalse())
                .groupBy(user)
                .orderBy(completedHabit.count().desc())
                .limit(10)
                .fetch();
    }

    private BooleanExpression categoryEq(Category category) {
        return category == null ? null : completedHabit.category.eq(category);
    }
Comments