Spring/자바 ORM 표준 JPA프로그래밍

JPQL 기본 문법과 기능

hyun-1200 2022. 5. 19. 15:25

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에서 불가능 하므로, 조인으로 풀어서 해결해야함.