놀고 싶어요

[Querydsl] Querydsl에서 Q타입 클래스 사용하는 방법, 3 가지 본문

JPA

[Querydsl] Querydsl에서 Q타입 클래스 사용하는 방법, 3 가지

챌린지 2022. 5. 15. 13:54

Querydsl에서 쿼리 작성 시 모델을 어떻게 사용하는지 알아보겠습니다.



Querydsl에서는 엔티티로 설정된 클래스에 Q모델이라는 쿼리타입 클래스를 미리 생성해놓고 메타데이터로 사용하여 쿼리를 메소드 기반으로 작성합니다.   

쉽게 말하자면 querydsl 프레임워크를 사용하면서 쿼리문을 작성하려면 Q타입 클래스가 필요합니다.



Q타입 클래스를 사용하는 방법은 세 가지 정도가 있습니다.

1. 별칭 직접 지정하여 사용하기
2. 기본 인스턴스 사용하기
3. static import하여 사용하기

package study.querydsl.repository;

import com.querydsl.jpa.impl.JPAQueryFactory;
import study.querydsl.domain.Member;
import study.querydsl.domain.QMember;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.EntityManager;

import static study.querydsl.domain.QMember.member;
import static org.assertj.core.api.Assertions.assertThat;

@Slf4j
@SpringBootTest
@Transactional
class MemberRepositoryTest {

    @Autowired
    EntityManager em;

    JPAQueryFactory queryFactory;
    
    @BeforeEach
    public void before() {
        queryFactory = new JPAQueryFactory(em);
    }

    @Test
    @DisplayName("Q파일 사용 방법")
    void Q파일사용() {
        // 1. 별칭 직접 지정
        QMember m1 = new QMember("m");
        Member member1 = queryFactory
                .selectFrom(m1)
                .where(m1.name.eq("member1"))
                .fetchOne();

        // 2. 기본 인스턴스 사용
        QMember m2 = QMember.member; 
        Member member2 = queryFactory
                .selectFrom(m2)
                .where(m2.name.eq("member1"))
                .fetchOne();

        // 3. 직접 static import 하여 사용 -> import static kbds.querydsl.domain.QMember.member;
        Member member3 = queryFactory
                .selectFrom(member)
                .where(member.name.eq("member1"))
                .fetchOne();

        assertThat(member1.getAge()).isEqualTo(member2.getAge()).isEqualTo(member3.getAge());
    }
}

 

보통 3번째 방식을 많이 사용합니다.