Post

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.