[본 포스팅은 실전! Querydsl 편을 기반으로 작성하였습니다.]
데이터를 DB에서 반환받을 때 필요한 정보만 받아야 할 때가 많이 있다.
그래서 프로젝션으로 결과를 반환받는데
이때 방법을 Projections와 @QueryProjection을 사용해서 받아볼 것이다.
상황) 모든 멤버의 ID를 제외하고 이름과 나이를 반환받기
1. 프로퍼티 접근 - Setter
Projections.Bean()
List<MemberDto> result = queryFactory
.select(Projections.bean(MemberDto.class,
member.username,
member.age))
.from(member)
.fetch();
Projections.bean()을 통해 MemberDto.class로 반환받겠다고 알린 후 값을 넣어주면 되는데
이때 Setter를 통해 주입이 된다.
2. 필드 직접 접근
Projections.fields()
List<MemberDto> result = queryFactory
.select(Projections.fields(MemberDto.class,
member.username,
member.age))
.from(member)
.fetch();
Projections.fields()를 통해 위와 같이 그대로 파라미터를 넣어주면 되는데 이것은 필드에 직접 접근해서 dto로 반환시켜 준다.
3. 필드 직접 접근(별칭이 다를 때)
Projection.fields()
QMember memberSub = new QMember("memberSub");
List<UserDto> result = queryFactory
.select(Projections.fields(UserDto.class,
member.username.as("name"),
ExpressionUtils.as(
JPAExpressions
.select(memberSub.age.max())
.from(memberSub), "age")
)
).from(member)
.fetch();
예를 들어 MemberDto의 이름에서는 username이 아닌 name으로 사용될 때 두 가지 방법이 있는데
첫 번째는 as()로 필드에 별칭 적용을 하거나
ExpressionUtils로 필드나 서브 쿼리에 별칭 적용을 할 수 있다.
4. 생성자 사용
Projections.constructor
List<UserDto> result = queryFactory
.select(Projections.constructor(UserDto.class,
member.username,
member.age))
.from(member)
.fetch();
이 방법은 일단 dto에 기본 생성자와 모든 필드를 넣는 생성자를 만들어둬야 한다.
그리고 위와 같이 사용하면 된다.
5. @QueryProjection
List<MemberDto> result = queryFactory
.select(new QMemberDto(member.username, member.age))
.from(member)
.fetch();
이 방법은 먼저 dto의 생성자에 다음과 같이 @QueryProjection을 넣어주고
Gradle - 패키지 - Tasks - other - compileQuerydsl을 실행시켜준 다음
QMemberDto가 패키지 - build - generated - 패키지[main] - ... - dto - QMemberDto가 생긴 것을 확인하고
@QueryProjection
public MemberDto(String username, int age) {
this.username = username;
this.age = age;
}
select(new QMemberDto(member.username, member.age))로 dto를 사용하면 된다.
- 이 방법은 컴파일러로 타입을 체크할 수 있으므로 가장 안전한 방법이다.
- 다만 DTO에 QueryDSL 애노테이션을 유지해야 하는 점과 DTO까지 Q 파일을 생성해야 하는 단점이 있다.
'JAVA > Querydsl' 카테고리의 다른 글
[Querydsl] 동적 쿼리 - Where 다중 파라미터 사용 (0) | 2023.01.06 |
---|---|
Querydsl, Gradle에 추가해서 빌드하기 & 검색 조건 (0) | 2023.01.04 |