본문 바로가기
Spring Study/JPA 기본

[JPA] 객체지향 쿼리 언어(JPQL)

by 정재인 2023. 11. 7.

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

댓글