JPQL(Java Persistence Query Language)란?
JPQL은 엔티티 객체를 대상으로 조회하는 쿼리이다.
JPQL 특징
· 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리이다.
· SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다.
· 즉, JPQL은 객체지향 SQL이다.
JPQL과 SQL
//검색
String jpql = "select m From Member m where m.name like m.age > 18'";
List<Member> result = em.createQuery(jpql, Member.class)
.getResultList();
select
m.id as id,
m.age as age,
m.USERNMAE as USERNAME,
m.TEAM_ID as TEAM_ID
from
Member m
where
m.age > 18
JPQL 문법
· 엔티티와 속성은 대·소문자 구분 O ex) Member, age
· JPQL 키워드는 대·소문자 구분 X ex) SELECT, FROM, where
· 엔티티 이름 사용, 테이블 이름 X
· 별칭은 필수 (as는 생략가능)
· TypeQuery: 반환 타입이 명확할 때 사용
· Query: 반환 타입이 명확하지 않을 때 사용
TypeQuery<Member> query =
em.createQuery("select m from Member m", Member.class);
Query query =
em.createQuery("select m.username, m.age, from Member m");
<결과 조회 API>
· query.getResultList(): 결과가 하나 이상일 때, 리스트 반환 / 결과가 없으면 빈 리스트 반환
· query.getSingleResult(): 결과가 정확히 하나, 단일 객체 반환
<페이징 API>
· setFirstResult(int startPosition): 조회 시작 위치(0부터 시작)
· setMaxResults(int maxResult): 조회할 데이터 수
String jpql = "select m from Member m order by m.name desc";
List<Member> resultList = em.createQuery(jpql, Member.class)
.setFirstResult(10)
.setMaxResults(20)
.getResultList();
JPQL - 경로 표현식
상태필드, 연관필드
· 상태 필드(state field): 단순히 값을 저장하기 위한 필드
· 연관 필드(association field): 연관관계를 위한 필드
- 단일 값 연관 필드: @ManyToOne, @OneToOne, 대상이 엔티티
- 컬렉션 값 연관 필드: @OneToMany, @ManyToMany, 대상이 컬렉션
JPQL - 패치 조인(fetch join)
· SQL 조인 종류 X
· JPQL에서 성능 최적화를 위해 제공하는 기능
· 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능
· join fetch 명령어 사용
[JPQL]
select m from Member m join fetch m.team
[SQL]
SELECT M.*, T.* FROM MEMBER M INNER JOIN TEAM T ON M.TEAM_ID = T.ID
패치 조인과 일반 조인의 차이
· JPQL은 결과를 반환할 때 연관관계 고려 X
· SELECT 절에 지정한 엔티티만 조회
· 패치 조인을 사용할 때만 연관된 엔티티도 함께 조회 (즉시 로딩)
· 패치 조인은 객체 그래프를 SQL 한 번에 조회하는 개념
패치 조인의 특징 및 한계
· 패치 조인 대상에는 별칭을 줄 수 없다.
· 둘 이상의 컬렉션은 패치 조인 X
· 컬렉션을 패치 조인하면 페이징 API(setFirstResult, setMaxResults) 사용 X
· 연관된 엔티티들을 SQL 한 번으로 조회 - 성능 최적화
· 엔티티에 직접 적용하는 글로벌 로딩 전략보다 우선
· 실무에서는 글로벌 로딩 전략은 모두 지연 로딩
· 최적화가 필요한 곳은 패치 조인 적용
'Spring Study > JPA 기본' 카테고리의 다른 글
[JPA] 값 타입 (0) | 2023.11.06 |
---|---|
[JPA] 프록시와 연관관계 관리 (1) | 2023.11.01 |
[JPA] 고급 매핑 (0) | 2023.10.31 |
[JPA] 다양한 연관관계 매핑 (0) | 2023.10.30 |
[JPA] 연관관계 매핑 (0) | 2023.10.18 |
댓글