반응형
DTO에 값 담는 방법
- 프로퍼티 접근 (setter 사용)
- 필드 접근
- 생성자 이용
- @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();
반응형
'Spring Data > Query DSL' 카테고리의 다른 글
QueryDSL Spring Data JPA + 동적 쿼리 (0) | 2023.01.18 |
---|---|
QueryDSL 벌크 쿼리 (0) | 2023.01.16 |
QueryDSL 동적 쿼리 (0) | 2023.01.16 |
QueryDSL 문법 (0) | 2023.01.15 |
QueryDSL Spring Data JPA 같이 적용하기 (0) | 2023.01.14 |