JPQL 객체 지향 쿼리 언어
JPA
·
JPQL이란?
- 테이블이 아닌 엔티티 객체를 대상으로 검색하는 객체 지향 쿼리
- JPA가 지원하는 SQL을 추상화한 객체 지향 쿼리
- SQL을 추상화했기에 특정 데이터베이스 SQL에 의존X
- 한마디로 객체 지향 SQL
- 결국 SQL로 변환됨
- SQL 문법과 유사
SELECT, FROM, WHERE, ORDER BY, GROUP BY, HAVING, JOIN 등 지원
왜 JPQL을 사용하는가?
- 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능
- 필요한 데이터만 불러오기 위해 검색 조건이 포함된 SQL 필요
JPQL 문법
- 엔티티와 속성 대소문자 구분O
- JPQL 키워드 대소문자 구분X
- 테이블 이름이 아닌 엔티티 이름 사용
- 별칭 필수 (as 생략 가능)
- ex) select m from Member m where m.age > 18
- 파라미터 바인딩하기
- select m from Member m where m.username=:username
- query.setParameter(“username”, usernameParam);
JPQL 쿼리 저장
- TypeQuery : 반환 타입이 명확할 때 사용
- Query : 반환 타입이 명확하지 않을 때 사용
- 사용 예시)
JPQL 결과 조회
- query.getResultList() : 결과가 하나 이상일 때, 리스트 반환
- query.getSingleResult() : 결과가 정확히 하나, 단일 객체 반환
- 결과가 없으면 : javax.persistence.NoResultException
- 둘 이상이면 : javax.persistence.NonUniqueResultException
페이징
- setFirstResult(int startPosition) : 조회 시작 위치 (0 부터)
- setMaxResults(int MaxResult) : 조회할 데이터 수
- ex)
명시적 조인과 묵시적 조인
- 명시적 조인이란 join 키워드 직접 사용한 조인
ex) select m from Member m join m.team t
- 묵시적 조인이란 경로 표현식에 의해 묵시적으로 SQL 조인을 사용한 조인
- ex) select m.team from Member m
- 경로 표현식이란 점을 찍어 객체 그래프를 탐색하는 것
- 가급적 묵시적 조인 대신 명시적 조인 사용해라
- 조인이 일어나는 상황을 파악하기 힘듦
- 조인은 SQL 튜닝에 중요
페치 조인 (fetch join)
- JPQL에서 성능 최적화를 위해 제공하는 기능
- SQL 조인 종류가 아님
- 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능
- SQL 한 번에 객체와 연관 객체까지 조회
- 실무에서 정말 중요한 내용이므로 따로 자세히 포스팅할 예정
Named 쿼리
- 미리 정의해서 이름을 부여해두고 사용하는 JPQL
- 애플리케이션 로딩 시점에 쿼리를 검증 (오류를 잡을 수 있음)
- 애노테이션이나 XML에 정의
- ex) 애노테이션 정의
벌크 연산
- JPA 변경 감지 기능으로 수정이나 삭제를 하려면 너무 많은 SQL을 실행
- 벌크 연산이란 쿼리 한 번으로 여러 엔티티를 변경
- 벌크 연산은 영속성 컨텍스트를 무시하고 데이터베이스에 직접 쿼리
- 벌크 연산 사용법
- 첫 번째 방법, 벌크 연산을 먼저 실행
- 두 번째 방법, 벌크 연산 수행 후 영속성 컨텍스트 초기화
- executeUpdate()의 결과는 영향 받은 엔티티 수 반환
- ex)
출처
자바 ORM 표준 JPA 프로그래밍 - 기본편 by 김영한