티스토리 뷰

    @Test
    public void queryByExample(){
        Team teamA = new Team("teamA");
        em.persist(teamA);

        Member m1 = new Member("m1", 0, teamA);
        Member m2 = new Member("m2", 0, teamA);

        em.persist(m1);
        em.persist(m2);

        em.flush();
        em.clear();

        //probe 생성
        Member member = new Member("m1"); //username 검색
        Team team = new Team("teamA");
        member.setTeam(team); //연관관계까지 검색해줌

        //ExampleMatcher 생성 , age 프로퍼티는 무시
        ExampleMatcher matcher = ExampleMatcher.matching().withIgnorePaths("age"); //조건시에 age는 무시한다
        Example<Member> example = Example.of(member, matcher);

        List<Member> result = memberRepository.findAll(example);

        Assertions.assertThat(result.get(0).getUsername()).isEqualTo("m1");
    }

 

 

- Probe : 필드에 데이터가 있는 실제 도메인 객체

- ExapleMatcher : 특정 필드를 일치시키는 상세한 정보 제공, 재상요가능

- Example : probe와 ExampleMatcher로 구성, 쿼리를 생성하는데 사용

 

장점

- 동적 쿼리를 편리하게 처리

- 도메인 객체를 그대로 사용

- 데이터 저장소를 RDB에서 NOSQL로 변경해도 코드 변경이 없게 추상화 되어 있음

- 스프링 데이터 JPA 'JpaRepository' 인터페이스에 이미 포함

 

단점

- 조인은 가능하지만 내부 조인(INNER JOIN)만 가능함 외부 조인(LEFT JOIN) 안됨

- 다음과 같은 중첩 제약조건 안됨

  - firstname = ?0 or (firstname= ?1 and lastname =?2)

- 매칭 조건이 매우 단순함

  - 문자는 'starts/contains/ends/regex'

  - 다른 속성은 정확한 매칭('=')만 지원

 

정리

- 실무에서 사용하기에는 매칭 조건이 너무 단순하고, LEFT 조인이 안됨

- 실무에서는 QueryDsl을 사용하자

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
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
글 보관함