ABOUT ME

Today
Yesterday
Total
  • [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에 의존적이기 때문에 깔끔하게 사용하길 원하거나 다른방식을 많이 채용하는 곳에선 쓰기 애매할 수 있다.

     

     

    출처 : 실전! Querydsl - 인프런 | 학습 페이지 (inflearn.com)

    댓글

Designed by Tistory.