프로젝션과 결과 반환 - 기본
값의 반환 타입이 여러개이므로 Tuple형태이다.
Tuple은 QueryDSL 전용 타입이다.
아래의 데이터 반환 타입이 Repository단계에서 해결되는 것이 좋지, 실제 비즈니스 로직인 Service에 해당 데이터 타입이 넘어가는 것은 좋지 않다.
List<Tuple> result = queryFactory
.select(member.username, member.age)
.from(member)
.fetch();
프로젝션과 결과 반환 - DTO 사용 - JPQL
List<MemberDto> resultList = em.createQuery("select new querydsl.querydsl.dto.MemberDto(m.username, m.age) "
+ "from Member m", MemberDto.class)
.getResultList();
setter를 사용하고 기본 생성자를 사용하는 방법이기에 실제로 사용 절대 금기
List<MemberDto> result = queryFactory
.select(
Projections.bean(MemberDto.class, member.username, member.age)
)
.from(member)
.fetch();
Fileds 접근법
getter와 setter가 없이 되는 필드 접근법
List<MemberDto> result = queryFactory
.select(
Projections.fields(MemberDto.class, member.username, member.age)
)
.from(member)
.fetch();
생성자 접근법
List<MemberDto> result = queryFactory
.select(
Projections.constructor(MemberDto.class, member.username, member.age)
)
.from(member)
.fetch();
위를 활용한 나이가 가장 많은 나이로 모두 출력하는 방법
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 와 UserDto 의 필드가 username, name으로 같지 않기 떄문에 userDto = UserDto(name=null, age=10) 이렇게 결과가 나오게 된다.
그렇기 떄문에 별칭으로 이름을 맞춰주면 이를 해결할 수 있다.
userDto = UserDto(name=member1, age=10)
@QueryProjection
하지만 계속 Projections... 하면서 호출할 순 없다.
이를 해결하기 위해 마법같은 기능이 있는데, dto 생성자에 @QueryProjection을 사용하면 실제 쿼리에서 dto를 바로 사용할 수 있다.
// MemberDto
@QueryProjection
public MemberDto(String username, int age) {
this.username = username;
this.age = age;
}
List<MemberDto> result = queryFactory
.select(new QMemberDto(member.username, member.age))
.from(member)
.fetch();
'JPA > QueryDSL' 카테고리의 다른 글
[QueryDSL] 7. QueryDSL의 Paging 처리 (Count Query 활용) (0) | 2023.12.07 |
---|---|
[QueryDSL] 6. 동적 쿼리(중요⭐️) - BooleanBuilder, Where 다중 파라미터 사용 (0) | 2023.12.06 |
[QueryDSL] 4. QueryDSL의 Join과 FetchJoin (0) | 2023.12.06 |
[QueryDSL] 3. 정렬과 페이징, SubQuery (0) | 2023.12.04 |
[QueryDSL] 2. QueryDSL 문법 VS JPQL 문법 비교 (0) | 2023.12.01 |