프로젝션이란 select 절에 뭘 가져올지 대상을 지정하는 것을 의미합니다.
단순히 사용자 이름만 가져오는 경우를 생각해봅시다.
List<String> result = queryFactory
.select(member.username)
.from(member)
.fetch();
반환 타입을 String 으로 맞추면 됩니다. username 만 가져오기 때문입니다. 타입이 하나 밖에 없으니까요. (참고로 Member 엔티티 타입으로 받아도 프로젝션 대상이 하나인 것입니다.)
프로젝션 대상이 하나면 타입을 명확하게 지정할 수 있습니다.
하지만 타입이 둘 이상이면 불가능하겠죠.
타입이 둘 이상인 경우는 튜플이나 DTO 로 조회를 해야합니다.
튜플은 QueryDsl 이 여러개를 조회할 때를 대비해서 만들어놓은 타입입니다.
import com.querydsl.core.Tuple
List<Tuple> result = queryFactory
.select(member.username, member.age) //...1
.from(member)
.fetch();
for (Tuple tuple : result) {
String username = tuple.get(member.username); //...2
Integer age = tuple.get(member.age); //...2
System.out.println("username=" + username);
System.out.println("age=" + age);
}
데이터를 가져올 때는 get() 을 사용해서 프로젝션에 넣어준 값을 파라미터로 넘겨주면 됩니다.