QueryDSL DTO에 값 담기

DTO에 값 담는 방법

  1. 프로퍼티 접근 (setter 사용)
  2. 필드 접근
  3. 생성자 이용
  4. @QueryProjection 어노테이션

 

1.  프로퍼티 접근

    List<MemberDto> result = jpaQueryFactory
            .select(Projections.bean(MemberDto.class,
                    member.username,
                    member.age))
            .from(member)
            .fetch();
  • Projection.bean ( Class, {field, ... } )
    • 이 메소드를 사용하면 기본 생성자와 setter를 통해서 객체를 만듭니다.
    • 때문에 DTO에 setter, getter를 설정해주어야 합니다.

 

 

2. 필드 접근

    List<MemberDto> result = jpaQueryFactory
            .select(Projections.fields(MemberDto.class,
                    member.username,
                    member.age))
            .from(member)
            .fetch();
  • Projection.fields ( Class, {field, ... }  )
    • 프로퍼티 접근이 아닌 필드에 바로 주입하기 때문에 DTO가 getter, setter를 갖고 있지 않아도 됩니다.
  • QMember.member와 MemberDto.class의 필드 이름이 매칭되어야 할기 때문에 이름이 같아야 합니다.
    • 필드 이름이 다른 경우 아래 예시 처럼 별칭을 주면 됩니다. 아래 예시는 Dto명도 UserDto로 지어주었습니다.
    List<UserDto> result = jpaQueryFactory
            .select(Projections.fields(UserDto.class,
                    member.username.as("name"),
                    ExpressionUtils.as(
                            JPAExpressions
                            .select(memberSub.age.max())
                            .from(memberSub), "age"
                    )))
            .from(member)
            .fetch();
  • 필드명.as( alias ) : 필드에 별칭 적용
  • ExpressionUtils.as( source, alias ) : 필드 혹은 서브 쿼리에 별칭 적용

 

3. 생성자 이용

    List<MemberDto> result = jpaQueryFactory
            .select(Projections.constructor(MemberDto.class,
                    member.username,
                    member.age))
            .from(member)
            .fetch();

 

 

4. @QueryProjection

  • DTO 생성자에 @QueryProjection을 붙여준 다음 컴파일하여 DTO도 Entity 클래스와 마찬가지로 Q타입의 클래스를 생성해줍니다.
  • 이 방법은 DTO가 Query DSL에 의존하게 합니다.
@Data
@NoArgsConstructor
public class MemberDto {
    private String username;
    private Long age;

    @QueryProjection
    public MemberDto(String username, Long age) {
        this.username = username;
        this.age = age;
    }
}
  • gradle > tasks > other > compileQuerydsl 실행하면 QMemberDTO 생성됩니다.

 

    List<MemberDto> result = queryFactory
            .select(new QMemberDto(member.username, member.age))
            .from(member)
            .fetch();