본문 바로가기
JPA/JPQL

JPQL 기본문법과 기능

by 킹차니 2021. 7. 19.
김영한님의 인프런 강의와 PDF를 바탕으로 정리하였습니다.
https://www.inflearn.com/courses?s=%EA%B9%80%EC%98%81%ED%95%9C

 

JPQL 소개

1. JPQL 객체지향 쿼리 언어. 따라서 테이블을 대상으로 쿼리 하는 것이 아니라 엔티티 객체를 대상으로 쿼리한다.

2. JPQLSQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다.

3. JPQL결국 SQL로 변환된다.

 

아래 같은 간단한 모델을 설계하겠습니다.

 

Member

 

Team

 

Orders

 

Product

 

 

 

 

 

 

 

JPQL 문법

select_:: = select_from_[where_] [groupby_] [having_] [orderby_]

update_:: = update_[where_]

delete_:: = delete_[where_]

 

  • select m from Member as m where m.age > 18
  • 엔티티와 속성은 대소문자 구분 O (Member, age)
  • JPQL 키워드는 대소문자 구분 X (SELECT, FROM, where)
  • 엔티티 이름 사용, 테이블 이름이 아님(Member)
  • 별칭은 필수(m) (as는 생략가능)

 

집합과 정렬은 다음과 같이 할 수 있습니다.

물론 GROUP BYHAVINGORDER BY도 가능합니다.

 

 

 

 

TypeQuery,  Query

TypeQuery: 반환 타입이 명확할 때 사용
Query: 반환 타입이 명확하지 않을 때 사용

 

아래의 코드를 보면 이해할 수 있습니다.

"select m from Member m" 은 그 결과로 확실히 Member타입의 엔티티가 나올 것입니다. 하지만

"select m.username, m.age from Member m" 은 결과의 타입이 확실치 않기 때문에(username은 문자형, age는 정수형) 아래처럼 TypeQuery가 아닌, Query로 결과를 받아야 합니다.

 

 


 

 

결과 조회 API

 

query.getResultList():

결과가 하나 이상일 때, 리스트 반환

 결과가 없으면 빈 리스트 반환

 

query.getSingleResult():

 결과가 정확히 하나, 단일 객체 반환

 결과가 없으면: javax.persistence.NoResultException
 둘 이상이면: javax.persistence.NonUniqueResultException

 

 

query.getResultList() 사용

 

query.getSingleResultList() 사용

만약 위를 실행했을 때 kevin이라는 member가 없다면 javax.persistence.NoResultException 에러가.

kevin이라는 이름이 둘 이상이라면 javax.persistence.NonUniqueResultException 에러가 발생할 것입니다.

 

 

 

 

파라미터 바인딩 - 이름 기준, 위치 기준

 

이름 기준으로 파라미터를 바인딩하면 아래와 같습니다.

 

위치 기준으로 파라미터를 바인딩하면 아래와 같습니다.

하지만 주석에 언급했듯이 위치 기준은 권장하지 않는 방법입니다.

 

 

'JPA > JPQL' 카테고리의 다른 글

JPQL 타입표현과 기타식  (0) 2021.07.21
JPQL 서브쿼리  (0) 2021.07.21
JPQL 페이징, 조인  (0) 2021.07.20
JPQL 프로젝션  (0) 2021.07.20
JPQL 객체지향 쿼리 언어 소개  (0) 2021.07.19