-
[Spring] querydsl - 프로젝션과 결과 반환 방법Spring 2022. 1. 5. 01:18
추천하는 방법에는 크게 두가지가 있다.
- 필드 직접 접근
- @QueryProjection 사용
필드 직접 접근
@Test public void findDtoByField() throws Exception{ List<MemberDto> result = queryFactory .select(Projections.fields(MemberDto.class, member.username, member.age)) .from(member) .fetch(); }
필드에 직접 접근하기 때문에 생성자 등이 필요없다.
별칭이 다르거나 새로운 컬럼을 쓸 때도 as등을 이용해 활용 가능하다.
@Data public class UserDto { private String name; private int age; } @Test public void findUserDto() throws Exception{ QMember memberSub = new QMember("memberSub"); List<UserDto> fetch = queryFactory .select(Projections.fields(UserDto.class, member.username.as("name"), ExpressionUtils.as( JPAExpressions .select(memberSub.age.max()) .from(memberSub), "age") ) ).from(member) .fetch(); }
@QueryProjection
@Data public class MemberDto { private String username; private int age; @QueryProjection public MemberDto(String username, int age) { this.username = username; this.age = age; } public MemberDto(Member member) { this.username = member.getUsername(); this.age = member.getAge(); } }
생성자에 @QueryProjection을 추가하고, gradle의 compileQuerydsl실행하여 QMemberDto 생성
@Test public void findDtoByQueryProjection() throws Exception{ List<MemberDto> result = queryFactory .select(new QMemberDto(member.username, member.age)) .from(member) .fetch(); }
이 방법은 컴파일러로 타입을 체크할 수 있으므로 가장 안전한 방법이다.
다만 DTO에 QueryDSL 어노테이션을 유지해야 하는 점과 DTO까지 Q파일을 생성해야 하는 단점이 있다.
querydsl에 의존적이기 때문에 깔끔하게 사용하길 원하거나 다른방식을 많이 채용하는 곳에선 쓰기 애매할 수 있다.
'Spring' 카테고리의 다른 글
[Spring] querydsl - 수정, 삭제 벌크 연산 (0) 2022.01.05 [Spring] querydsl - 동적쿼리 만드는 법 (0) 2022.01.05 [Spring] querydsl - 임의의 기준으로 정렬을 하고 싶다면 (0) 2022.01.05 [Spring] AssertJ 정리 (0) 2022.01.04 [Spring] querydsl - join (0) 2022.01.03