본문 바로가기

dev/Spring

JPQL, Criteria

JPQL 개요

 

JPA에서 사용되는 JPQL은 SQL 쿼리를 추상화 한다.

즉 하나의 쿼리 언어를 통해 다양한 DB를 사용할 수 있다.

 

JPQL은 SQL문과 유사하지만, 다른 점이 존재하기 때문에 이를 고려해 사용해야 한다.

예를 들어 inline view를 사용할 수 없고, insert 문이 존재하지 않는다(Entity manager를 사용해야 한다).

 

한편, JPQL의 대상은 테이블이 아닌 객체라는 것 또한 고려해야 한다.

즉, JPQL은 DB 테이블과 직접적인 의존관계를 지니지 않는다는 것을 생각해야 한다.


기본 질의

JPQL은 기본적으로 SQL 문법과 유사한 구조를 가지고 있다.

// SELECT
SELECT ... FROM ...
[WHERE ...]
[GROUP BY ... [HAVING ...]]
[ORDER BY ...]

// UPDATE
UPDATE ... SET ... [WHERE ...]

// DELETE
DELETE FROM ... [WHERE ...]

// INSERT문은 지원하지 않는다.

다만, 사용시 유의해야 할 점이 있다.

1. 별칭(alias)을 필수로 사용해야 한다. 별칭을 지정할 때 AS는 생략이 가능하다.

2. 질의에서는 '테이블명'이 아닌 테이블에 매핑되는 '객체명'을 사용해야 한다. (관련 링크)

// users 라는 테이블이 있고 해당 테이블에 매핑되는 Users 라는 domain 클래스가 있다고 가정

// QuerySyntaxException: users is not mapped [from users] 에러 발생
@Query(value = "select u from users u where u.id = :userId)

// 정상 작동
@Query(value = "select u from Users u where u.id = :userId);

 


Criteria를 이용한 질의

JPA의 질의 방법은 크게 두 가지로 구분할 수 있다.

  • Java 코드를 이용한 질의(Criteria, QueryDSL)
  • SQL 문을 이용한 질의

둘 중, SQL문을 이용한 질의는 네이티브 쿼리라고 부르며 특별한 경우를 제외하고 사용이 권장되지는 않는다. 특정 DBMS에 종속적인 쿼리가 될 가능성이 높기 때문이다. 만약 네이티브 쿼리의 비중이 높다면 Hibernate 같은 JPA 구현체보다 Mybatis등을 사용하는 것이 더 좋다고 한다.

 

Java 코드를 이용한 질의는 Criteria를 이용해 수행 가능하다. Criteria는 JPA에서 표준으로 제공하는 API이며, Java로 JPQL을 작성할 수 있도록 해 준다. 한편, 코드가 보다 단순하고 가독성이 좋은 QueryDSL과 같은 오픈소스를 사용할 수 도 있다.

 

Spring Boot를 사용중이라면 커스텀 레포지토리를 작성해 Criteria를 사용할 수 있다.

사실 이 포스트를 작성하게 된 가장 큰 동기는 spring boot 프로젝트 도중 쿼리를 직접 작성하는 방법이 궁금해서였다.

커스텀 레포지토리를 작성하는 방법은 예전에 포스팅 한 적이 있다.

더 구체적인 내용은 이곳을 참조하면 좋을 것 같다.

 

 

[참조]

해피그래머 블로그(JPA-JPQL과 Criteria 쿼리)