자바 ORM 표준 JPA 프로그래밍(인프런)

Ch10. 객체지향 쿼리 언어1(기본 문법) - 기본 문법과 쿼리 API

webmaster 2021. 12. 17. 11:35
728x90

JPQL은 객체지향 쿼리 언어다. 따라서 테이블을 대상으로 쿼리 하는 것이 아니라 엔티티 객체를 대상으로 쿼리 한다.

JPQL은 SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다.

JPQL은 결국 SQL로 변환된다.

예시로 사용할 도메인 모델과 DB모델

JPQL 문법

select_문 :: = 
	select_절 
	from_절
 	[where_절]
 	[groupby_절]
 	[having_절]
 	[orderby_절]
    
update_문 :: = update_절 [where_절]
delete_문 :: = delete_절 [where_절]
  • select m from Member as m where m.age > 18 
  • 엔티티와 속성은 대소문자 구분O (Member, age) 
  • JPQL 키워드는 대소문자 구분X (SELECT, FROM, where) 
  • 엔티티 이름 사용, 테이블 이름이 아님(Member) 
  • 별칭은 필수(m) (as는 생략가능)

집합과 정렬

select
 COUNT(m), //회원수
 SUM(m.age), //나이 합
 AVG(m.age), //평균 나이
 MAX(m.age), //최대 나이
 MIN(m.age) //최소 나이
from Member m
  • DB의 그룹 함수와 집합 함수를 사용할 수 있다.
  • GROUP BY, HAVING 
  • ORDER BY

TypeQuery, Query

반환타입이 명확할 때는 TypedQuery를 불명확할때는 Query를 사용한다.

  • TypeQuery: 반환 타입이 명확할 때 사용
  • Query: 반환 타입이 명확하지 않을 때 사용

결과 조회 API

SingleResult시 결과가 없으면 에러가 난다(단, SpringDataJPA는 이 에러를 추상화하여 없어도 오류 발생 X)

  • query.getResultList(): 결과가 하나 이상일 때, 리스트 반환
    • 결과가 없으면 빈 리스트 반환 
  • query.getSingleResult(): 결과가 정확히 하나, 단일 객체 반환 
    • 결과가 없으면: javax.persistence.NoResultException
    • 둘 이상이면: javax.persistence.NonUniqueResultException

파라미터 바인딩 - 이름 기준, 위치 기준

파라미터 바인딩 같은경우 이름, 위치를 기준으로 바인딩 할수 있는데 위치 기준은 변경될 위험이 있기에 사용 X

  • 위치 기반도 지원하지만 사용하지 않는 걸 추천한다.
  • 서비스 장애가 발생할 수 있음

 

728x90