2 분 소요

인프런 실전! Querydsl 강의 내용 정리

검색 조건 쿼리

기본 검색 쿼리

1
2
3
4
5
6
7
8
9
10
11
12
13
@Test  
public void search() throws Exception {  
    //given  
    //when    
	Member findMember = queryFactory  
            .selectFrom(member)  
            .where(member.username.eq("member1")  
                    .and(member.age.eq(10)))  
            .fetchOne();  
    //then  
    assertThat(findMember.getUsername()).isEqualTo("member1");  
    assertThat(findMember.getAge()).isEqualTo(10);  
}

다음과 같이 where절에 조건 .and 조건 체인 형식으로 쭉쭉 조건을 추가할 수 있다.

JPQL이 제공하는 모든 검색 조건 제공

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
member.username.eq("member1") // username = 'member1' 
member.username.ne("member1") //username != 'member1' 
member.username.eq("member1").not() // username != 'member1' 

member.username.isNotNull() //이름이 is not null 

member.age.in(10, 20) // age in (10,20) 
member.age.notIn(10, 20) // age not in (10, 20) 
member.age.between(10,30) //between 10, 30 

member.age.goe(30) // age >= 30 
member.age.gt(30) // age > 30 
member.age.loe(30) // age <= 30 
member.age.lt(30) // age < 30 

member.username.like("member%") //like 검색 
member.username.contains("member") // like ‘%member%’ 검색 
member.username.startsWith("member") //like ‘member%’ 검색
...
1
2
3
4
.where(  
        member.username.eq("member1")  
        .and(member.age.eq(10))  
)

and 는 다음과 같이 체인 방식이 있고

1
2
3
4
.where(  
          member.username.eq("member1")  
        , member.age.eq(10)  
)

이런 식으로 표현도 가능 하다.

실제로도 동일하게 작동하는 걸 볼 수 있다.

결과 조회

  • fetch() : 리스트 조회, 데이터 없으면 빈 리스트 반환
  • fetchOne() : 단 건 조회
    • 결과가 없으면 : null
    • 결과가 둘 이상이면 : com.querydsl.core.NonUniqueResultException
    • fetchFirst() : limit(1).fetchOne()
    • fetchResults() : 페이징 정보 포함, total count 쿼리 추가 실행
    • fetchCount() : count쿼리로 변경해서 count 수 조회
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
32
@Test  
public void resultFetch() throws Exception {  
  
    // List  
    List<Member> fetch = queryFactory  
            .selectFrom(member)  
            .fetch();  
      
    // 단 건  
    Member fetchOne = queryFactory  
            .selectFrom(member)  
            .fetchOne();  
  
    // 처음 한 건 조회  
    Member fetchFirst = queryFactory  
            .selectFrom(member)  
            .fetchFirst();  
  
    // 페이징에서 사용  
    QueryResults<Member> results = queryFactory  
            .selectFrom(member)  
            .fetchResults();  
  
    results.getTotal();  
    List<Member> content = results.getResults();  
  
      
    // count 쿼리로 변경  
    long total = queryFactory  
            .selectFrom(member)  
            .fetchCount();  
}

그런데 인텔리제이에서

다음과 같이 fetchResults(), fetchCount() 에 대해 deprecated 라고 경고한다.

강의 자료 8번에 있는 내용이다.

Querydsl의 fetchCount() , fetchResult() 는 개발자가 작성한 select 쿼리를 기반으로 count용 쿼리를 내부 에서 만들어서 실행합니다. 그런데 이 기능은 강의에서 설명드린 것 처럼 select 구문을 단순히 count 처리하는 용도로 바꾸는 정도입니다. 따라서 단순한 쿼리에서는 잘 동작하지만, 복잡한 쿼리에서는 제대로 동작하지 않습니다. Querydsl은 향후 fetchCount() , fetchResult()지원하지 않기로 결정했습니다. 참고로 Querydsl의 변화가 빠르지는 않기 때문에 당장 해당 기능을 제거하지는 않을 것입니다.

따라서 count 쿼리는 다음과 같이 별도로 작성해야 한다.

1
2
3
4
5
6
7
8
@Test  
public void count() throws Exception {  
    Long totalCount = queryFactory  
            //.select(Wildcard.count)       // select count(*)  
            .select(member.count())         // select count(member.id)  
            .from(member)  
            .fetchOne();  
}
  • count(*) 을 사용하고 싶으면 주석 처럼 Wildcard.count을 사용
  • member.count()를 사용하면 count(member.id)로 동작
  • 응답 결과는 숫자 하나 이므로 fetchOne() 사용

태그: ,

카테고리:

업데이트:

댓글남기기