[JPA] QueryDSL

1

JPA

목록 보기
13/16
post-thumbnail

Criteria와 QueryDSL

JPA Criteria는 문자가 아닌 코드로 JPQL을 작성하므로 문법 오류를 컴파일 단계에서 잡을 수 있고 IDE 자동완성 기능의 도움을 받을 수 있는 등 여러 가지 장점이 있다. 하지만 Criteria의 가장 큰 단점은 너무 어렵고 복잡하다는 것이다. 그를 보완하기 위해 나온 것이 QueryDSL이다. 이는 매우 쉽고 간결하며 그 모양도 쿼리와 비슷하게 개발할 수 있다. 지금부터 QueryDSL을 알아보자.


기본 Q 생성

쿼리 타입(Q)은 사용하기 편리하도록 기본 인스턴스를 보관하고 있다. 하지만 같은 엔티티를 조인하거나 같은 엔티티를 서브쿼리에 사용하면 같은 별칭이 사용되므로 이때는 별칭을 직접 지정해서 사용해야 한다.

쿼리 타입(Q)는 다음과 같이 작성한다.

QMember qMember = new QMember("m"); // 직접 지정
QMember qMember = QMember.member; // 기본 인스턴스 사용

위의 쿼리 타입 인스턴스도 import static을 사용하여 한 문장으로 줄일 수 있다.

import static 프로젝트 경로.QMember.member; // 기본 인스턴스

검색 조건 쿼리

QueryDSL의 기본 쿼리 기능에 대해서 알아보자.

JPAQuery query = new JPAQuery(em);
QItem item = QItem.item;
List<Item> list = query.from(item)
	.where(item.name.eq("상품") .and(item.price.gt(20000))
    	.list(item); // 조회할 프로젝션 지정

이를 실행하면 다음과 같은 JPQL이 실행된다.

select item
from Item item
where item.name = ?1 and item.price > ?2

이처럼 QueryDSL은 검색 조건 쿼리에 강력하다

그냥 전체 조회는 em.createQuery( ) 메서드를 사용하여 작성하면 되지만 조건이 필요한 조회라면 매우 복잡한데 이를 보완하기 위해 QueryDSL을 사용한다.

0개의 댓글