JPQL
1 JPQL
- JPQL은 객체지향 쿼리 언어이다
- JPA는 다양한 쿼리 방법을 지원한다.
- JPQL, JPA Criteria, QueryDSL, 네이티브 SQL, JDBC API 직접 사용, MyBatis 등
- JPQL은 엔티티 객체를 대상으로 쿼리
- SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다
- JPQL은 결국 SQL로 변환된다
1.1 JPQL을 사용하는 이유
- 가장 단순한 조회 방법으로
EntityManager.find()
과 같이 엔티티 매니저를 통해 엔티티를 조회할 수 있다. - 그러나 나이가 18살 이상인 회원을 모두 조회하고 싶다면?
- 모든 DB 데이터를 객체로 전환해서 애플리케이션에서 나이가 18살 이상인 회원을 검색하는 것은 불가능하다.
- 즉 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하고 이것이 JPQL이다.
JPQL 예시
//검색
String jpql = "select m from Member m where m.age > 18";
List<Member> result = em.createQuery(jpql, Member.class).getResultList();
실제 실행된 SQL
select m.id as id,
m.age as age,
m.USERNAME as USERNAME,
m.TEAM_ID as TEAM_ID
from Member m
where m.age > 18
2 기본 문법과 기능
- 엔티티와 속성은 대소문자 구분
- member, Member
- JPQL 키워드는 대소문자를 구분하지 않는다.
- select, Select
- 엔티티 이름 사용, 테이블 이름이 아니다
- 별칭은 필수
- as는 생략가능
2.1 TypeQuery
- 반환 타입이 명확할 때 사용
TypedQuery<Member> query = em.createQuery("SELECT m FROM Member m", Member.class);
2.2 Query
- 반환 타입이 명확하지 않을 때 사용
Query query = em.createQuery("SELECT m.username, m.age from Member m");