예시
em.createQuery("select p.name, p.age,p.team from player p")
Query 형식 -> 조회 결과의 자료형을 규정할 수없으므로 Object 배열을 사용한다.
참고한 블로그 : 24. JPQL - 프로젝션(Projection, Select) (tistory.com)
List<String> result = queryFactory
.select(member.username)
.from(member)
.fetch();
List<Tuple> res = queryFactory
.select(member.username, member.age)
.from(member)
.fetch();
for (Tuple re : res) {
String username = re.get(member.username);
Integer age = re.get(member.age);
System.out.println("username = " + username);
System.out.println("age = " + age);
}
순수 JPA 에서 DTO를 통해서 조회하는 방법
new Operation 활용
DTO의 package 이름을 다 적어줘야해서 지저분해 보인다.
생성자 방식만 지원.
@Test
public void findDtoByJPQL(){
List<MemberDto> result = em.createQuery("select new study.querydsl.dto.MemberDto(m.username, m.age)" +
" from Member m", MemberDto.class).getResultList();
}
결과를 DTO 반환할 때 사용한다.
프로퍼티 접근
List<MemberDto> result = queryFactory
.select(Projections.bean(MemberDto.class,
member.username,
member.age
))
.from(member)
.fetch();
필드 직접 접근
List<MemberDto> result2 = queryFactory
.select(Projections.fields(MemberDto.class,
member.username,
member.age))
.from(member)
.fetch();
생성자 사용
queryFactory.select(Projections.constructor(MemberDto.class),
member.username,
member.age)
.from(member)
.fetch();
참고 : Querydsl Projection 방법 소개 및 선호하는 패턴 정리 - Yun Blog | 기술 블로그 (cheese10yun.github.io)
.as 를 통해서 별칭 맞춰주기.
@Test
public void diffAlias(){
QMember memberSub = new QMember("memberSub");
queryFactory
.select(Projections.fields(UserDto.class,
member.username.as("name"), // userDto의 name 별칭이랑 매칭
ExpressionUtils.as(
JPAExpressions
.select(memberSub.age.max())
.from(memberSub),"age")
)
).from(member)
.fetch();
}