Post

JPQL 기본 문법





참고



JPQL

  • 원래 JPA에서 엔티티의 변경이 일어난 경우에 (엔티티가 영속 상태라면) 커밋 시점에 자동으로 변경에 대한 쿼리가 날아간다.
    • 그러나 이 경우에는 변경이 일어난 엔티티마다 쿼리가 하나씩 날아간다.
    • 또 조회 역시 em.find()를 통해 엔티티를 받아오면 엔티티 하나당 하나의 쿼리가 날아간다.
  • JPQL은 벌크 연산(대량의 데이터를 한 번에 불러오는 연산)이 가능하다.





JPQL 기본 문법

  • 엔티티와 멤버 변수의 대소문자를 구별해야 한다.
  • JPQL 키워드의 경우엔 대소문자를 구별하지 않는다.
  • 테이블의 이름이 아닌 엔티티의 이름을 사용한다.
  • 엔티티의 별칭이 필수이다.


SELECT

1
2
3
4
5
List<Book> resultList = em.createQuery("SELECT b FROM Book b WHERE b.title LIKE :title", Book.class)
        .setParameter("title", "book%");
        .getResultList();

  • title이 book으로 시작하는 Book 엔티티를 리스트로 받아온 것을 볼 수 있다.


UPDATE

1
2
3
4
5
6
int i = em.createQuery("UPDATE Book b SET b.title = :newTitle WHERE b.title = :title")
        .setParameter("newTitle", "babo")
        .setParameter("title", "book1")
        .executeUpdate();

  • title이 book1인 Book 엔티티의 title을 babo로 업데이트한 것을 볼 수 있다.
  • 정수형 리턴값은 update 문에 영향을 받은 로우의 수를 반환해준 것이다.
    • title이 book1인 Book 엔티티가 한 개 뿐이라면 1이 반환될 것이고
    • title이 book1인 Book 엔티티가 여러개라면 그 개수가 반환된다.


DELETE

1
2
3
4
5
int i = em.createQuery("DELETE FROM Book b WHERE b.title = :title")
        .setParameter("title", "book1");
        .executeUpdate();

  • title이 book1인 Book 엔티티를 모두 삭제한 것이다.
  • 반환된 정수값은 역시 삭제된 로우의 개수이다.



집합과 정렬

  • Aggregate function
    • count, avg, sum, max, min
  • group by, having
  • order by
  • 모두 사용 가능하다.


집계 함수

count

1
2
3
4
Long count = em.createQuery("SELECT COUNT(b) FROM Book b", Long.class)
        .getSingleResult();

  • count 함수 사용법이다.
  • getSingleResult()를 사용해서 결과를 받아온다.
  • 반환 타입은 Long으로 잡아줘야 한다.


sum

1
2
3
4
Long sum = em.createQuery("SELECT SUM(b.price) FROM Book b", Long.class)
        .getSingleResult();


avg

1
2
3
4
Long avg = em.createQuery("SELECT AVG(b.price) FROM Book b", Long.class)
        .getSingleResult();


min

1
2
3
4
Long min = em.createQuery("SELECT MIN(b.price) FROM Book b", Long.class)
        .getSingleResult();


max

1
2
3
4
Long max = em.createQuery("SELECT MAX(b.price) FROM Book b", Long.class)
        .getSingleResult();



그룹과 정렬

group by

1
2
3
4
Long count = em.createQuery("SELECT COUNT(b) FROM Book b GROUP BY b.bookshelf HAVING COUNT(b) > 1", Long.class)
    .getSingleResult();


order by

1
2
3
4
Long count = em.createQuery("SELECT COUNT(b) as cnt FROM Book b GROUP BY b.bookshelf HAVING COUNT(b) > 1 ORDER BY cnt ASC", Long.class)
    .getSingleResult();

  • 여기서 좀 특이한게 order by 에는 as로 지정한 별칭이 사용 가능한다.
    • having에 별칭을 넣으면 에러가 뜬다.





This post is licensed under CC BY 4.0 by the author.