Querydsl - 기본 문법 - 1 검색 조건 쿼리, 결과 조회
인프런 실전! 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()사용
댓글남기기