JPQL
- JPQL은 객체지향 쿼리 언어이다. 엔티티 객체를 대상으로 쿼리한다.
- JPQL 문법
- select m from Member m where m.age >18
- 엔티티는 대문자로, 속성은 소문자로 구분 O (Member, age)
- JPQL 키워드는 대소문자 구분X ( SELECT, select )
- 엔티티 이름 사용, 테이블 이름이 아님!
- 별칭은 필수(m)
TypeQuery : 반환 타입이 명확할 때 사용
Query: 반환 타입이 명확하지 않을 때 사용
query.getResultList() : 결과가 하나 이상일 때 리스트 반환. 결과가 없으면 빈 리스트 반환
query.getSingleResult() : 결과가 정확히 하나일때 단일 객체 반환. 결과 없거나 둘 이상이면 exception 발생
< 파라미터 바인딩 >
프로젝션
- SELECT 절에 조회할 대상을 지정하는 것
- 프로젝션 대상 : 엔티티, 임베디드 타입, 스칼라타입 ( 숫자, 문자등 기본 데이터 타입 )
- 엔티티 프로젝션 : select m from Member m
- 임베디드 타입 프로젝션 : select m.addredd from Member m
- 스칼라 타입 프로젝션 : select m.username, m.age from Member m.
페이징 API
- setFirstResult(int startPosition) : 조회 시작위치 ( 0 부터 시작 )
- setMaxResults(int maxResult) : 조회할 데이터 수
조인
ON절을 활용한 조인 (JPA 2.1부터 지원)
1. 조인 대상 필터링
ex. 회원과 팀을 조인하면서 팀 이름이 A인 팀 조인
- JPQL : select m, t from Member m LEFT JOIN m.team t on t.name='A'
- SQL : select m.*, t.* from Meber m LEFT JOIN Team t on m.team_id=t.id and t.name='A'
2. 연관관계 없는 엔티티 외부 조인 ( 하이버네이트 5.1부터 )
ex. 회원의 이름과 팀의 이름이 같은 대상 외부 조인
- JPQL : select m,t from Member m LEFT JOIN Team t on m.username= t.name
- SQL : select m.*, t.* from Member m LEFT JOIN Team t on m.username= t.name
서브쿼리
- 나이가 평균보다 많은 회원
- select m from Member m where m.age > ( select avg(m2.age) from Member m2 )
- 한 건이라도 주문한 고객
- select m from Member m where (select count(o) from Order o where m= o.member) > 0
- 서브쿼리 지원 함수
- [NOT] EXISTS : 서브쿼리에 결과가 존재하면 참
- ALL : 모두 만족하면 참
- ANY, SOME : 조건을 하나라도 만족하며녀 참
- [NOT] IN : 서브쿼리 겨로가 중 하나라도 같은 것이 있으면 참
- 서브쿼리 한계
- JPA는 where, having 절에서만 서브쿼리 가능
- select 절도 가능 (하이버네이트에서 지원)
- from 절의 서브쿼리는 현재 JPQL에서 불가능 하므로, 조인으로 풀어서 해결해야함.
'Spring > 자바 ORM 표준 JPA프로그래밍' 카테고리의 다른 글
객체지향 쿼리언어 소개 (JPQL / QueryDSL) (0) | 2022.05.19 |
---|---|
값 타입 ( 기본값, 임베디드 타입 @Embedded, 값 타입 컬렉션@CollectionTable ) (0) | 2022.05.12 |
프록시와 연관계/ 즉시로딩: EAGER / 지연로딩: LAZY / 영속성전이:cascade/ 고아객체: orphanRemoval (0) | 2022.05.11 |
고급매핑 : 상속관계 매핑 /@MappedSuperclass (0) | 2022.05.10 |
다양한 연관관계 매핑 (0) | 2022.05.08 |