[Querydsl] Querydsl 조회 결과를 별도 DTO 클래스로 받기 - projection
by 스뎅(thDeng) onQuerydsl로 조회를 할 때 entity 전체가 아닌 일부 column만 꺼내오면, 아래처럼 Tuple
을 사용해야 하고 하나하나 필드를 알고 있어야 하는 불편함이 있다.
List<Tuple> userContacts = query.from(user)
.select(user.name, user.mobile, user.address)
.fetch();
for (Tuple contact : userContacts) {
System.out.println("user: " + contact.get(user.name));
System.out.println("mobile: " + contact.get(user.mobile));
}}
이럴 때 조금 더 명시적으로 DTO 클래스를 사용하고 싶다면 com.querydsl.core.types.Projections
를 쓰면 된다.
List<UserContactDto> userContacts = query.from(user)
.select(Projections.constructor(UserContactDto.class,
user.name,
user.mobile,
user.address))
.fetch();
public class UserContactDto {
private String name;
private String mobile;
private String address;
public UserContactDto(String name, String mobile, String address) {
...
}
// getter
}
Projections.constructor()
로 projection할 클래스와 column을 지정해 주면 된다. 메소드명에서 보이듯이 생성자를 통해서 DTO 객체를 생성한다. 위처럼 DTO에는 생성자가 필수이다. 생성자로 만드는 방법 이외에도 Projections.bean()
, Projections.fields()
처럼 entity bean을 생성해서 채우거나 필드로 채워주는 메소드도 지원한다.