List<TeamMemberDto> result = queryFactory
.select(Projections.constructor(TeamMemberDto.class,
member.userName, member.age))
.from(member)
.fetch();
생성자의 경우 (constructor) 타입만 맞으면 된다. TeamMemberDto의 teamMemberName이 Member 도메인의 userName과 매칭되는 것은 타입이 동일하기 때문
List<MemberDto> result = queryFactory
.select(Projections.bean(MemberDto.class,
member.userName, member.age)) // 이게 dto 랑 정확히 매칭 되어야 쓸수 있음
.from(member)
.fetch();
setter 메서드를 이용해서 조회하는 방법 (bean)
setter 메서드를 이용할때는 이렇게 dto의 멤버변수들과 entity의 멤버 변수가 일치해야한다.
List<MemberDto> result = queryFactory
.select(Projections.fields(MemberDto.class,
member.userName, member.age)) // 이게 dto 랑 정확히 매칭 되어야 쓸수 있음
.from(member)
.fetch();
field를 직접 조회해서 사용 (fields)
setter와 동일하게 멤버변수들의 명칭이 일치해야한다.
as 메서드를 이용해서 alias를 정할수 있고, 또 서브쿼리를 작성할때도 alias를 정해서 만들어 낼수도 있다.
QMember subMember = new QMember("subMember");
List<TeamMemberDto> result = queryFactory
.select(Projections.fields(TeamMemberDto.class,
member.userName.as("teamMemberName"), // 아래와 같은 표현
//ExpressionUtils.as(member.userName, "teamMemberName"),
ExpressionUtils.as(
JPAExpressions
.select(subMember.age.max())
.from(subMember), "age")
))
.from(member)
.fetch();
만들고자하는 생성자에 @QueryProjection 어노테이션을 달아주고 , compileQuerydsl 로 컴파일해주면 Q 파일이 생긴다.
package study.querydsl.dto;
import com.querydsl.core.annotations.QueryProjection;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
public class MemberDto {
private String userName;
private int age;
@QueryProjection
public MemberDto(String userName, int age) {
this.userName = userName;
this.age = age;
}
}
Dto를 Q파일로 만들면 아래처럼 간단하게 사용가능
List<MemberDto> result = queryFactory
.select(new QMemberDto(member.userName, member.age))
.from(member)
.fetch();