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