객체지향 쿼리
- JPQL
- Criteria 쿼리
- 네이티브 쿼리
-
QueryDSL
- JDBC, MyBatis
- JPA와 같이 사용한다면, 영속성 컨텍스트를 적절한 시점에 강제로 플러시해야 한다.
JPQL
- 대소문자 구분
- 엔티티 이름
- 별칭은 필수
TypeQuery
기능
- 프로젝션 가능
- Entity to DTO
- 페이징
- 조인
- 내부 조인, 외부 조인, 컬렉션 조인, 세타 조인
- 페치 조인
- JPQL은 연관관계를 고려하지 않는다. 단지 지정한 엔티티만 조회할 뿐이다.
경로 표현식
- Path Expression
- 단일 값 연관 필드로 경로 탐색을 하면 내부조인을 하게되고 이를 묵시적 조인이라고 한다.
조건식, 다형성 쿼리, 사용자 정의 함수 호출
- 나중에 사용할 때 보는 걸로…
Named 쿼리
- 로딩시점에 JPQL 문법 체크 후, 미리 파싱
- 자바 코드와 XML 지원
Criteria
- JPQL 빌더 클래스 API
- 동적 쿼리의 안정성
- 빠른 문법 체크 가능(컴파일 단계)
- But, 사용시 코드가 복잡하다
요즘은 별로 안사용하므로, 패스
QueryDSL
- Criteria 단점을 보완해서 나온 API
querydsl-jpa: QueryDSL JPA 라이브러리
querydsl-apt: 쿼리 타입(Q클래스)을 생성할 때 필요한 라이브러리
- http://www.querydsl.com/static/querydsl/4.0.1/reference/ko-KR/html_single/
네이티브 SQL
- 표준 SQL이 지원하는 대부분의 문법과 SQL 함수 지원
네이티브 SQL
- 직접 JDBC API과 달리, 영속성 컨텍스트의 기능을 그대로 사용할 수 있다.
- 결과 매핑을 위해,
@SqlResultSetMapping
사용
NamedNativeQuery
- 보통 네이티브 쿼리는 데이터베이스 성능 최적화를 위한 것이므로 XML로 관리하는 것이 용이할 수 있다.
StoredProcedure, NamedStoredProcedure
- JPA 2.1 부터 지원
심화
벌크 연산
- 영속성 컨텍스트를 무시한다.
- 벌크 연산과 영속성 컨텍스트의 데이터가 있다면 이를 주의하며 작업해야 한다.
영속성 컨텍스트와 JPQL
- 조회시 엔티티가 아니라면 영속성 컨텍스트에서 관리되지 않는다.
- ex) 엔티티의 임베디드 타입, 엔티티의 필드
- 영속성 컨텍스트에 이미 엔티티가 있다면, 조회한 결과를 버리고 영속성 컨텍스트에 있는 엔티티를 반환한다.
- JPQL은 항상 데이터베이스에 SQL을 실행해서 결과를 조회한다.
JPQL와 플러시모드
- AUTO(Default), COMMIT
- 꼭 필요한 곳에서만 사용을 권장