728x90
순수JPA
@Test
public void findDtoJPQL() throws Exception {
List<MemberDto> result = em.createQuery("select new study.querydsl.dto.MemberDto(m.username,m.age) from Member m", MemberDto.class)
.getResultList();
for (MemberDto memberDto : result) {
System.out.println("memberDto = " + memberDto);
}
}
- 순수 JPA에서 DTO를 조회할 때는 new 오퍼레이션을 사용해야한다.
- DTO의 package path를 모두 적어줘야 한다.
- 생성자 방식만 지원한다.
QueryDSL
- 프로퍼티 접근
- 필드 접근
- 생성자 접근
1. 프로퍼티 접근
@Test
public void findDtoBySetter() throws Exception {
List<MemberDto> result = queryFactory
.select(Projections.bean(MemberDto.class,
member.username,
member.age))
.from(member)
.fetch();
for (MemberDto memberDto : result) {
System.out.println("memberDto = " + memberDto);
}
}
- Projections.bean(주입대상클래스, 프로퍼티1, 프로퍼티2) 방식으로 프로퍼티에 값을 주입한다.
Projections.bean
setter(bean)를 통해 데이터를 인젝션 해주며 기본 생성자가 무조건 필요하다.
(기본생성자를 만들어주거나 롬복 : @NoArgsContructor 사용)
2. 필드 접근
@Test
public void findDtoByField() throws Exception {
List<MemberDto> result = queryFactory
.select(Projections.fields(MemberDto.class,
member.username,
member.age))
.from(member)
.fetch();
for (MemberDto memberDto : result) {
System.out.println("memberDto = " + memberDto);
}
}
- Getter, Setter가 없어도 필드에 바로 값을 주입한다.
- Projections.fields(주입대상클래스, 필드1, 필드2...)
- !!!!!!!!!!!주의 필드명이 같아야 한다 !!!!!!!!!!!!!
Projections.fields
필드에 직접 접근하기 때문에 세터와 기본생성자가 필요없다.
2-1. 필드명이 다를때
@Test
public void findUserDtoByField() throws Exception {
QMember memberSub = new QMember("memberSub");
List<UserDto> result = queryFactory
.select(Projections.fields(UserDto.class,
member.username.as("name"),
ExpressionUtils.as(JPAExpressions
.select(memberSub.age.max())
.from(memberSub), "age")
))
.from(member)
.fetch();
for (UserDto memberDto : result) {
System.out.println("memberDto = " + memberDto);
}
}
- 필드나 프로퍼티명 접근 생성방식에서 이름이 다를 때 해결방안을 as('name')을 이용해서 해결한다.
- ExpressionUtils.as(source, alias) : 필드나 서브 쿼리에 별칭 적용
- username.as("memberName") : 필드에 별칭 적용
3. 생성자 접근
@Test
public void findDtoByConstructor() throws Exception {
List<MemberDto> result = queryFactory
.select(Projections.constructor(MemberDto.class,
member.username,
member.age))
.from(member)
.fetch();
for (MemberDto memberDto : result) {
System.out.println("memberDto = " + memberDto);
}
}
Projections.constructor
- 생성자와 select절의 순서 중요 !!!!!
- 롬복의 @AllArgsConstructor 필요, setter가 필요 없다.
728x90
'개-발 > Database' 카테고리의 다른 글
[QueryDSL] 동적쿼리 BooleanBuilder , Where 절 (0) | 2023.03.15 |
---|---|
[QueryDSL] Predicate / BooleanBuilder (1) | 2023.03.15 |
[JPA] Paging / Pagination (Pageable) (0) | 2023.01.28 |
[QueryDSL] 페이징 최적화 (fetchResult Deprecated) (0) | 2023.01.28 |
[Jpa] jpaRepository + Query DSL 둘 다 사용하기 (0) | 2023.01.28 |