ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 데이터 JPA와 Querydsl 동시 사용
    JPA/Querydsl 2023. 8. 13. 19:41

    스프링 데이터 JPA 리포지토리

    public interface MemberRepository extends JpaRepository<Member, Long>, MemberRepositoryCustom {
        // 스프링 데이터 JPA에서 메서드 이름으로 자동 쿼리 만들어줌
        List<Member> findByUsername(String username);
    }

    스프링 데이터 JPA의 인터페이스를 만든다. 쿼리명을 가지고 대부분의 기능들은 스프링 데이터 JPA에서 해결하고 특별한 쿼리만을 Querydsl로 개발하면 되니까 훨씬 간편해질 것이다.

     

     

     

    기능 구현을 위한 인터페이스

    public interface MemberRepositoryCustom {
        List<MemberTeamDto> search(MemberCond condition);
    }

    Querydsl을 이용할 때에는 따로 커스텀을 만들어준다. 이 때, 인터페이스로 만들어줘야하는데, 그 이유는 MemberRepository에서 상속받아서 사용해야하기 때문이다. 이후에 구현체를 만들어서 구현해주면 된다.

     

     

     

    인터페이스의 구현체

    public class MemberRepositoryImpl implements MemberRepositoryCustom{
    
        private final JPAQueryFactory queryFactory;
    
        public MemberRepositoryImpl(EntityManager em) {
            this.queryFactory = new JPAQueryFactory(em);
        }
    
        @Override
        public List<MemberTeamDto> search(MemberCond condition) {
            return queryFactory
                    .select(new QMemberTeamDto(
                            member.id.as("memberId"),
                            member.username,
                            member.age,
                            team.id.as("teamId"),
                            team.name.as("teamName")))
                    .from(member)
                    .leftJoin(member.team, team)
                    .where(
                            usernameEq(condition.getUsername()),
                            teamNameEq(condition.getTeamName()),
                            ageGoe(condition.getAgeGoe()),
                            ageLoe(condition.getAgeLoe()))
                    .fetch();
        }
    
        private BooleanExpression usernameEq(String username) {
            return isEmpty(username) ? null : member.username.eq(username);
        }
        private BooleanExpression teamNameEq(String teamName) {
            return isEmpty(teamName) ? null : team.name.eq(teamName);
        }
        private BooleanExpression ageGoe(Integer ageGoe) {
            return ageGoe == null ? null : member.age.goe(ageGoe);
        }
        private BooleanExpression ageLoe(Integer ageLoe) {
            return ageLoe == null ? null : member.age.loe(ageLoe);
        }
    }

    구현체의 이름은 이걸 사용할 리포지토리인 MemberRepository + Impl이다. 코드는 저번 포스팅에서 동적 쿼리를 만들었던 코드 그대로를 사용했다.

    'JPA > Querydsl' 카테고리의 다른 글

    Querydsl에서 스프링 데이터 JPA의 페이징 활용  (0) 2023.08.13
    Querydls 동적 쿼리 활용  (0) 2023.08.13
    Querydsl의 수정, 삭제 쿼리  (0) 2023.08.13
    Querydsl의 동적 쿼리  (0) 2023.08.13
    Dto로 프로젝션 결과 반환  (0) 2023.08.13
Designed by Tistory.