JPQL이란
참고
JPQL이란
- Java Persistence Query Language
- JPA는 다양한 쿼리 방법을 지원한다.
- JPQL
- 쿼리 빌더 (Cirteria, Querydsl)
- Native SQL
- JDBC API
- MyBatis
- 등
- JPQL은 객체 지향 쿼리 언어이다.
- 테이블을 대상이 아닌 객체를 대상으로 질의한다.
- JPA에서 사용하는 플랫폼 독립적인 쿼리 언어이다.
- JPQL은 SQL을 추상화하여 특정 DB의 문법에 의존하지 않으며, DB의 종류에 상관 없이 모두 같은 문법의 JPQL을 사용한다.
- JPQL은 사용하는 DB에 맞춰 SQL로 변환되어 날아간다.
JPQL
1
2
3
4
List<Book> resultList = entityManager.createQuery("select b from Book b where m.title like 'babo%'", Book.class)
.getResultList();
- 위의 예시는 ‘babo’로 시작하는 책 제목의 엔티티를 모두 가져오는 것이다.
- getResultList()를 사용해 List로 결과를 가져왔다.
- Book 엔티티의 컬렉션 타입으로 결과를 받았다.
Query Builder
- String으로 쿼리를 짜면 오타가 날 경우가 많다.
- 쿼리 빌더를 사용해서 객체의 메서드를 사용해 타이핑에 안전하게 쿼리를 만들 수 있다.
- 또 JPQL의 경우 String으로 쿼리를 짜기 때문에 동적 쿼리를 만드는게 상당히 귀찮다.
- 이런 점들 때문에 JPQL의 대안으로 쿼리 빌더가 있다.
- Criteria
- Querydsl
1
2
3
4
5
6
7
8
9
10
11
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Book> query = cb.createQuery(Book.class);
Root<Book> b = query.from(Book.class);
CriteriaQuery<Book> cq = query.select(b).where(cb.like(b.get("title"), "book%"));
List<Book> resultList = em.createQuery(cq)
.getResultList();
- Criteria 쿼리 빌더를 사용해 메서드를 통해 쿼리를 만든 예시이다.
- 위의 JPQL 예시의
- select b from Book b where m.title like ‘babo%’와
- query.select(b).where(cb.like(b.get(“title”), “book%”))는 같은 조회 결과를 가져다 준다.
동적 쿼리
1
2
3
4
5
6
7
8
9
10
11
String title = null;
String sql = "select b from Book b";
if(title != null) {
sql += " where m.title like 'babo%'";
}
List<Book> resultList = entityManager.createQuery(sql, Book.class)
.getResultList();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
String title = null;
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Book> query = cb.createQuery(Book.class);
Root<Book> b = query.from(Book.class);
CriteriaQuery<Book> cq = query.select(b));
if(title == null) {
cq.where(cb.like(b.get("title"), "book%")
}
List<Book> resultList = em.createQuery(cq)
.getResultList();
- JPQL에서 동적 쿼리를 짜는 방법과 Criteria를 통해 동적 쿼리를 짜는 방법이다.
- 이거나 저거나 둘 다 불편해보인다.
- Criteria가 JPA 표준 스펙이긴 하나 Querydsl을 사용하는 것을 권장한다.
- 훨씬 깔끔하고 사용하기 편하다.
네이티브 SQL
- SQL을 직접 사용하는 방법이다.
- JPQL 문법은 ANSI SQL 같은 표준적인 기능만을 제공하기 때문에
- JPQL에 없는 특정 DB에 종속적인 기능을 사용하고 싶을 때 사용한다.
1
2
3
4
List<Book> resultList = em.nativeQuery("select book_id, title from Book where title like 'babo%'", Book.class)
.getResultList();
- EntityManager의 nativeQuery() 메소드로 그냥 실제 사용하는 db의 sql을 작성해주면 된다.
- 결과는 똑같이 엔티티의 컬렉션으로 받을 수 있다.
This post is licensed under CC BY 4.0 by the author.