221004 Querydsl 결과 매핑

Jongleee·2022년 10월 4일
1

TIL

목록 보기
70/576

Querydsl 결과 매핑

1. 생성자 조회 (constructor)

List<TeamMemberDto> result = queryFactory
		.select(Projections.constructor(TeamMemberDto.class,
				member.userName, member.age))
		.from(member)
		.fetch();

생성자의 경우 (constructor) 타입만 맞으면 된다. TeamMemberDto의 teamMemberName이 Member 도메인의 userName과 매칭되는 것은 타입이 동일하기 때문

2. Setter 조회 (bean)

List<MemberDto> result = queryFactory
		.select(Projections.bean(MemberDto.class,
				member.userName, member.age)) // 이게 dto 랑 정확히 매칭 되어야 쓸수 있음
		.from(member)
		.fetch();

setter 메서드를 이용해서 조회하는 방법 (bean)

setter 메서드를 이용할때는 이렇게 dto의 멤버변수들과 entity의 멤버 변수가 일치해야한다.

3. Field 직접 조회 (fields)

List<MemberDto> result = queryFactory
		.select(Projections.fields(MemberDto.class,
				member.userName, member.age)) // 이게 dto 랑 정확히 매칭 되어야 쓸수 있음
		.from(member)
		.fetch();
 

field를 직접 조회해서 사용 (fields)

setter와 동일하게 멤버변수들의 명칭이 일치해야한다.

4. as (fields + as 별칭)

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();

5. dto 자체를 Q 파일로 사용

만들고자하는 생성자에 @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();

출처:https://jaime-note.tistory.com/75

0개의 댓글