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.