본문 바로가기

IT/JPA & Hibernate

[Hibernate] Querydsl - TO를 이용한 객체 조회

querydsl 설정하는 방법

2021.06.29 - [IT/JPA & Hibernate] - [Hibernate] Spring Boot Querydsl 설정하기
querydsl을 쿼리 결과를 엔티티가 아닌 미리 만들어둔 TO 객체에 담아 조회할 수 있습니다.

 

예제 소스

쿼리 결과를 원하는 객체에 담아 조회하기 위해서 Projections 클래스를 이용하며 select메소드의 parameter로 넘겨줍니다.
setter, fields, constructor 방식이 있으며 각각 Projections.bean(), Projections.constructor(), Projections.fields() 메소드를 이용합니다.

그리고 Q클래스의 정의된 멤버변수를 이용해 TO객체와 일대일 대응 시키는 방식으로 데이터를 담습니다.

 

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class MemberTO {
    public MemberTO(Long id) {
        this.id = id;
    }

    public MemberTO(Long id, String account, String name) {
        this.id = id;
        this.account = account;
        this.name = name;
    }

    private Long id;

    private String account;

    private String password;

    private String name;

}
@Test
    public void TO_객체에담아서조회하기_setter() {
        JPAQueryFactory query = new JPAQueryFactory(em);
        QMember qMember = QMember.member;

        //setter 방식 
        //반드시 각 멤버변수의 setter가 존재해야한다.
        MemberTO memberTO = query.select(Projections.bean(
                MemberTO.class,
                qMember.id,
                qMember.name,
                qMember.account
        ))
                .from(qMember)
                .where(qMember.id.eq(1L))
                .fetchOne();
    }

    @Test
    public void TO_객체에담아서조회하기_생성자() {
        JPAQueryFactory query = new JPAQueryFactory(em);
        QMember qMember = QMember.member;

        //constructor 방식
        //반드시 전달하려는 멤버변수의 개수에 맞는 생성자를 미리 선언해두어야 하며 
        //데이터가 잘못 초기화되지 않게 각 멤버변수가 일대일 대응될 수 있게 넣어주어야한다.
        MemberTO memberTO = query.select(Projections.constructor(
                MemberTO.class,
                qMember.id,
                qMember.name,
                qMember.account
        ))
                .from(qMember)
                .where(qMember.id.eq(1L))
                .fetchOne();
    }

    @Test
    public void TO_객체에담아서조회하기_field() {
        JPAQueryFactory query = new JPAQueryFactory(em);
        QMember qMember = QMember.member;

        //fields 방식
        //멤버변수가 private라도 대입이 가능하다. 
        MemberTO memberTO = query.select(Projections.fields(
                MemberTO.class,
                qMember.name,
                qMember.id,
                qMember.account,
                qMember.password
        ))
                .from(qMember)
                .where(qMember.id.eq(1L))
                .fetchOne();
    }