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 프로젝트 도중 쿼리를 직접 작성하는 방법이 궁금해서였다.
커스텀 레포지토리를 작성하는 방법은 예전에 포스팅 한 적이 있다.
더 구체적인 내용은 이곳을 참조하면 좋을 것 같다.
[참조]
'dev > Spring' 카테고리의 다른 글
Java Date와 Spring boot JPA(Hibrnate) (0) | 2019.05.01 |
---|---|
spring data jpa 사용자 정의 repository (0) | 2019.03.25 |
Advice를 이용한 예외 처리 (0) | 2019.03.21 |
spring data jpa에서 enum 사용 방법 (0) | 2019.03.21 |
파일 업다운로드 기본설정, 멀티파트 미디어 타입 (0) | 2019.02.24 |