JPQL이란?

1 분 소요

JPQL ?

JPQL (Java Persistence Query Language) is a query language defined by the JPA (Java Persistence API)

JPQL == Java Persistence Query Language
JPA의해 선언된 쿼리 언어로, 객체 지향 쿼리를(OOQ) 의미

SQL과의 차이점이라고 한다면, SQL은 DB의 테이블을 대상으로 쿼리문이 작성되고,
JPQL은 entity를 대상으로 쿼리문이 작성된다.

이리 작성된 JPQL은 결국 SQL로 변환되어 실행된다.

JPQL을 작성하는 방법으로 아래와 같은 방법이 있다.

  • @Query
  • Jpa Creteria Query
  • Query DSL

WHY?

JPA로는 할 수 없는것들.

  1. JOIN
  2. SELECT *




@Query

문자열로 직접 native 쿼리를 작성하여 JPQL 문을 실행

예시)

    @Query("SELECT u FROM User u WHERE u.age > :age")
    List<User> findUsersByAgeGreaterThan(int age);

장점:

다소 직관적인(?) native query 사용이 가능
사용해보면서 느낀점은 러닝커브 비용이 가장 cheap 했던것 같다.
테스트된 SQL을 다시 JPQL 문법으로 변환하는.. 수고로움만 뺀다면(?)..

단점:

참.. 할말이 많은데
작성된 쿼리가 문자열 형태이기 때문에 컴파일 시점에는 해당 문법이 잘못되었는지 알 수 없다. 환경(VDI, 폐쇠망)이 너무 힘들었다..
런타임 시점에 오류를 확인할 수 있음 실제 쿼리를 수행할 때 비로소 알 수 있음.

JPA Creteria Query, Query DSL

예시) (JPA Creteria Query)

    public List<Employee> findEmployeesByDepartment(String departmentName) {
        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
        CriteriaQuery<Employee> criteriaQuery = criteriaBuilder.createQuery(Employee.class);
        Root<Employee> root = criteriaQuery.from(Employee.class);
        
        criteriaQuery.select(root);
        criteriaQuery.where(criteriaBuilder.equal(root.get("department").get("name"), departmentName));
        
        return entityManager.createQuery(criteriaQuery).getResultList();
    }
    

예시) (Query DSL ) DSL == Domain Specific language

    public List<Employee> findEmployeesByDepartment(String departmentName) {
        JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
        QEmployee employee = QEmployee.employee;
        return queryFactory.selectFrom(employee)
                .where(employee.department.name.eq(departmentName))
                .fetch();
    }

위 두가지 방법 모두 컴파일 시점에 syntax 오류를 알 수 있다는 장점이 있고,
아직 사용해보지 않은 단점으로는 러닝커브 비용이라 꼽을 수 있을것 같고,
내용을 확인해본 결과 Creteria Query보다, Query DSL 방식이 조금 더 직관적이라 한다.