STUDY/Spring

Spring Boot | Querydsl Projections

개미606 2021. 8. 20. 10:00

Result handling

Querydsl은 결과를 커스터마이징 하기 위한 두 가지 방법을 제공한다.

  • FactoryExpressions: 열(row) 기반 변환
    • FactoryExpression 인터페이스는 빈 생성, 생성자 호출 그리고 더 복잡한 객체를 생성하기 위해 사용되며, Projections구현체를 이용한다.
  • ResultTransformer: 집합(aggregation)
    • ResultTransformer 인터페이스의 주요 구현체는 GroupBy클래스다.

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