실전! Querydsl

Ch03. 중급 문법 - 프로젝션과 결과 반환(기본, DTO 조회, @QueryProjection)

webmaster 2021. 12. 31. 10:11
728x90

프로젝션 대상이 하나

단일 프로젝션 조회

  • 프로젝션 대상이 하나면 타입을 명확하게 지정할 수 있음
  • 프로젝션 대상이 둘 이상이면 튜플이나 DTO로 조회

튜플 조회

Tuple 조회

  • 프로젝션 대상이 둘 이상일 때 사용

DTO 조회

DTO 생성
순수 JPA에서 DTO 조회
Querydsl 빈 생성(Bean population)
필드 직접 접근
생성자 사용

  • JPQL에서의 DTO 조회
    • 순수 JPA에서 DTO를 조회할 때는 new 명령어를 사용해야 함
    • DTO의 package이름을 다 적어줘야 해서 지저분함
    • 생성자 방식만 지원함
  • QueryDsl bean 생성( BeanPopulation)
    • Getter, Setter를 사용하여 값을 넣어준다.
  • 필드 직접 접근
    • 필드에 바로 접근하여 넣어준다(Getter,Setter 필요 X)
  • 생성자 사용
    • 생성자를 통해 주입해 준다(타입이 딱 맞아야된다)

별칭이 다를때

서브 쿼리를 사용하여 별칭이 다르거나, Dto의 이름과 뽑아오는 값이 다를 경우

UserDto
Test

  • name 속성이 이름이 다르다.
  • as, ExpressionUtils 사용
  • subQuery 같은 경우는 ExpressionUtils를 사용하고, 일반적인 속성들은 as를 사용한다

@QueryProjection 활용

@QueryProjection을 통해 Q파일을 생성한다.
Test

  • Q파일을 생성할 수가 있다
  • 단점
    • 1. 해당 DTO가 QueryDsl에 의존적 이게 된다(QueryDsl을 제거 시 에러)
    • 2. Q파일을 생성해야된다.
  • 단, Q파일을 생성함으로써 런타임에 에러를 잡을 수 있으며, 생성자에 어떤 값이 들어가는지 확인이 가능하다.

추가(Distinct)

List result = queryFactory 
			.select(member.username).distinct() 
            .from(member) 
            .fetch();

참고: distinct는 JPQL의 distinct와 같다

728x90