QueryDSL - 결과 조회

목차

Querydsl 결과 조회

  • fetch : 리스트 조회, 데이터가 없으면 빈 리스트 반환
  • fetchOne : 단건 조회
    • 결과가 없으면 : null
    • 결과가 둘 이상이면 NonUniqueResultException
  • fetchFirst : limit(1).fetchOne() 와 의미가 동일하다.
  • fetchResults : 페이징 정보 포함, total count 쿼리 추가 실행
  • fetchCount : count 쿼리로 변경해서 count 수 조회
@Test
public void resultFetch(){
List<Member> fetch = queryFactory.selectFrom(member)
.fetch();

Member fetchOne = queryFactory.selectFrom(QMember.member)
.fetchOne();

Member fetchFirst = queryFactory.selectFrom(QMember.member)
.fetchFirst();

QueryResults<Member> results = queryFactory.selectFrom(member)
.fetchResults();

results.getTotal();
List<Member> content = results.getResults();

// Deprecated
long total = queryFactory
.selectFrom(member)
.fetchCount();

// Count 쿼리 작성
long totalCount = queryFactory
.select(member.count())
.from(member)
.fetchOne();
  • fetchResults : 페이징 쿼리가 복잡해지면 content 를 가져오는 쿼리와 total count 를 가져오는 쿼리가 다를 때가 있어서 해당 메소드를 사용하면 안된다.

정렬

@Test
public void sort(){
em.persist(new Member(null, 100));
em.persist(new Member("member5", 100));
em.persist(new Member("member6", 100));

List<Member> result = queryFactory
.selectFrom(member)
.where(member.age.eq(100))
.orderBy(member.age.desc(), member.username.asc().nullsLast())
.fetch();

Member member5 = result.get(0);
Member member6 = result.get(1);
Member memberNull = result.get(2);

assertThat(member5.getUsername()).isEqualTo("member5");
assertThat(member6.getUsername()).isEqualTo("member6");
assertThat(memberNull.getUsername()).isNull();

}

페이징

  • offset 은 시작 위치를 가르킨다 (0 부터 시작한다.)
  • limit 는 몇개를 가져올지를 설정한다.
@Test
public void paging1(){
List<Member> result = queryFactory
.selectFrom(member)
.orderBy(member.username.desc())
.offset(1)
.limit(2)
.fetch();

assertThat(result.size()).isEqualTo(2);
}
Share