STUDY/Spring
Spring Boot | Querydsl Projections
개미606
2021. 8. 20. 10:00
Result handling
Querydsl은 결과를 커스터마이징 하기 위한 두 가지 방법을 제공한다.
FactoryExpressions
: 열(row) 기반 변환- FactoryExpression 인터페이스는 빈 생성, 생성자 호출 그리고 더 복잡한 객체를 생성하기 위해 사용되며,
Projections
구현체를 이용한다.
- FactoryExpression 인터페이스는 빈 생성, 생성자 호출 그리고 더 복잡한 객체를 생성하기 위해 사용되며,
ResultTransformer
: 집합(aggregation)- ResultTransformer 인터페이스의 주요 구현체는
GroupBy
클래스다.
- ResultTransformer 인터페이스의 주요 구현체는
Projections
쿼리 결과를 DTO클래스로 받을 때 주로 사용한다.
Bean population
쿼리 결과로부터 빈을 생성하고자 할 때 bean projection을 사용한다.Projections.bean()
메서드를 호출하여 사용하며, setter기반으로 값을 세팅하기 때문에 해당 DTO 클래스에는 setter메서드가 구현되어 있어야 한다.
@Getter
@Setter // lombok사용
public class UserDto {
private String firstName;
private String lastName;
}
첫 번째 인자로는 DTO 클래스 타입을 전달하고, 그 뒤로는 DTO에 세팅할 값들을 선택하여 전달한다.
List<UserDto> users = query.select(
Projections.bean(UserDto.class, user.firstName, user.lastName)).fetch();
필드를 직접 사용하는 방법도 있다. Projections.fields()
메서드를 호출하여 사용하며, `setter메서드를 사용하지 않는다.
List<UserDto> users = query.select(
Projections.fields(UserDto.class, user.firstName,user.lastName)).fetch();
Constructor usage
생성자 기반의 열 변환이 가능하다.
DTO클래스의 생성자에 @QueryProjection
애노테이션을 사용한다.
생성자 사용 역시 setter메서드가 필요하지 않다.
@Getter
public class UserDto {
private String firstName;
private String lastName;
@QueryProjection
public UserDto(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
사용 방법은 Projections.constructor()
메서드를 이용하는 것.
List<UserDto> users = query.select(
Projections.constructor(UserDto.class, user.firstName,user.lastName)).fetch();