QueryDSL에서 쿼리문을 처리한 후 반환되는 데이터를 조회하는 방법들을 보겠습니다.
// Member 테이블에는 총 4개의 튜플, Team 테이블에는 총 1개의 튜플이 저장되어 있습니다
@Test
void queryDslProjectionBasic() {
factory = new JPAQueryFactory(em);
QMember member = QMember.member;
QTeam team = QTeam.team;
List<Member> membersFetch = factory
.selectFrom(member)
.fetch();
Team teamFetchOne = factory
.selectFrom(team)
.fetchOne();
Member membersFetchFirst = factory
.selectFrom(member)
.fetchFirst();
Long memberCount = factory
.select(member.count())
.from(member)
.fetchOne();
Assertions.assertThat(membersFetch.size()).isEqualTo(4);
Assertions.assertThat(teamFetchOne.getName()).isEqualTo("TeamA");
Assertions.assertThat(membersFetchFirst).isInstanceOf(Member.class);
Assertions.assertThat(memberCount).isEqualTo(4);
}
1. fetch(): 쿼리문을 처리 한 후, 반환되는 값들을 그대로 리스트로 가져옵니다. 이떄, 반환되는 데이터가 없으면 빈 리스트(Empty List)가 반환됩니다.
2. fetchOne(): 단 하나의 데이터를 조회합니다. 쿼리문에 의해 반환되는 데이터가 0개 이면 NULL 반환, 1개이면 정상, 그리고 2개 이상일 경우에는 NonUniqueResultException가 발생합니다.
3. fetchFirst(): limit(1).fetchOne()과 동일하며, 항상 한개의 데이터만 조회됩니다.
4-1. fetchResult(): 페이징 정보 포함 & count 쿼리도 같이 실행됩니다. But, deprecated.
4-2. fetchCount(): 쿼리를 count 쿼리로 변경해서, count 값일 반환합니다. But, deprecated.
4-3. fetch + count:Long memberCount = factory .select(member.count()) .from(member) .fetchOne();