Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

SpringDataJPA Repository, 사용자 정의 repository 본문

인프런/[인프런] QueryDsl

SpringDataJPA Repository, 사용자 정의 repository

Seung__ 2021. 9. 4. 14:40

1. SpringDataJPA 적용


public interface MemberRepository extends JpaRepository<Member, Long> {

    List<Member> findByUsername(String username);
    
}

 

 

2. 사용자 정의 Repository


  • Querydsl을 사용하려면 사용자 정의 Repository 사용 필요함.
  • 사용자 정의 리포지토리 사용법
    • 사용자 정의 인터페이스 작성
    • 사용자 정의 인터페이스 구현
    • 스프링 데이터 리포지토리에 사용자 정의 인터페이스 상속
    • MemberRepository 가 MembeRepositoryCustom을 상속 받기 때문에 search() 사용 가능.
    • spring 에서 자동으로 구현체 매핑해줌.

 

 

2.1 MemberRepository


public interface MemberRepository extends JpaRepository<Member, Long>, MemberRepositoryCustom {

    List<Member> findByUsername(String username);

}

 

2.2 MemberRepositoryCustom


public interface MemberRepositoryCustom {

    List<MemberTeamDto> search(MemberSearchCondition condition);
}

 

 

2.3 MemberRepositoryCustomImpl


  • MemberRepositoryImpl 이름을 이렇게도 가능.
public class MemberRepositoryCustomImpl implements MemberRepositoryCustom{

    private final JPAQueryFactory queryFactory;

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

    @Override
    public List<MemberTeamDto> search(MemberSearchCondition 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 hasText(username) ? member.username.eq(username) : null;
    }

    private BooleanExpression teamNameEq(String teamName) {
        return hasText(teamName) ? team.name.eq(teamName) : null;
    }

    private BooleanExpression ageGoe(Integer ageGoe) {
        return ageGoe != null ? member.age.goe(ageGoe) : null;
    }

    private BooleanExpression ageLoe(Integer ageLoe) {
        return ageLoe != null ? member.age.loe(ageLoe) : null;
    }
}

 

2.3 Test


    @Test
    public void searchTest(){
        Team teamA = new Team("teamA");
        Team teamB = new Team("teamB");
        em.persist(teamA);
        em.persist(teamB);
        Member member1 = new Member("member1", 10, teamA);
        Member member2 = new Member("member2", 20, teamA);
        Member member3 = new Member("member3", 30, teamB);
        Member member4 = new Member("member4", 40, teamB);
        em.persist(member1);
        em.persist(member2);
        em.persist(member3);
        em.persist(member4);

        MemberSearchCondition condition = new MemberSearchCondition();
        condition.setAgeGoe(35);
        condition.setAgeLoe(40);
        condition.setTeamName("teamB");

        List<MemberTeamDto> result = memberRepository.search(condition);
        assertThat(result).extracting("username").containsExactly("member4");
    }

 

 

 

3.GitHub : 210904 custom Repository


 

GitHub - bsh6463/Querydsl

Contribute to bsh6463/Querydsl development by creating an account on GitHub.

github.com

 

'인프런 > [인프런] QueryDsl' 카테고리의 다른 글

CountQuery 최적화  (0) 2021.09.05
Querydsl 페이징 연동  (0) 2021.09.04
API 개발  (0) 2021.09.04
동적쿼리 성능 최적화 : Builder , where 다중 파라미터  (0) 2021.09.04
JPA Repository와 Querydsl  (0) 2021.09.04
Comments