JPA

QueryDSL(Criteria 보다 더 나은 JPQL 빌더)

쿠카이든 2022. 6. 16. 15:19
728x90
  • 쿼리를 문자가 아닌 코드로 작성해도, 쉽고 간결하며 그 모양도 쿼리와 비슷하게 개발할 수 있는 프로젝트가 바로 QueryDSL이다.
  • QueryDSL도 Criteria처럼 JPQL 빌더 역할을 하는데 JPA Criteria를 대체할 수 있다.

QueryDSL 설정

<plugins>
			....
            <plugin>
                <groupId>com.mysema.maven</groupId>
                <artifactId>apt-maven-plugin</artifactId>
                <version>1.1.3</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>process</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>target/generated-sources/java</outputDirectory>
                            <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            ....
 <plugins>
 <!-- QueryDSL APT Config -->
        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-apt</artifactId>
            <version>${querydsl.version}</version>
            <scope>provided</scope>
        </dependency>

        <!-- QueryDSL JPA Config -->
        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-jpa</artifactId>
            <version>${querydsl.version}</version>
        </dependency>
  • querydsl-jpa: QueryDSL JPA 라이브러리
  • querydsl-apt: 쿼리 타입(Q)을 생성할 때 필요한 라이브러리

쿼리 작성

public void queryDSL() {

    EntityManager em = emf.createEntityManager();
    
    JPAQuery query = new JPAQuery(em);
    QMember qMember = new QMember("m");  //생성되는 JPQL의 별칭이 m
    List<Member> members = 
         query.from(qMember)
             .where(qMember.name.eq("회원1"))
             .order(qMember.name.desc())
             .list(qMember);
}
  • QueryDSL을 사용하려면 우선 com.mysema.query.jpa.impl.JPAQuery 객체를 생성해야 하는데 이때 엔티티 매니저를 생성자에 넘겨준다.
  • 다음으로 사용할 쿼리 타입(Q)을 생성하는데 생성자에는 별칭을 주면 된다.
  • 이 별칭을 JPQL에서 별칭으로 사용한다.
  • 위의 코드로 실행된 최종 JPQL은 다음과 같다.
select m from Member m
 where m.name = ?1
 order by m.name desc

 

출처: 자바 ORM 표준 JPA 프로그래밍

728x90