10장 객체지향 쿼리 언어
객체 지향 쿼리 란
우리가 흔히 사용하는 쿼리문은 SQL 문에 해당한다. DB 테이블을 대상으로 하는 언어이다.
하지만 ORM은 객체와 DB를 매핑해주고 엔티티 객체 대상으로 개발을 하므로 엔티티 객체를 대상 으로 하는 쿼리문이 필요하다.
JPQL이 그에 해당하는 객체를 대상으로 하는 쿼리문 이다.
JPQL을 바탕으로 해석하여 SQL 로 변환하고 그것을 통해 DB에 접근한다.
JPQL은 SQL을 추상화 하기에 특정 DB에 의존하지 않는다.
QueryDsl
코드 기반, 단순하고 사용하기 쉽다.
Q객체 생성을 위해 설정만 조금 해준다면 코드 기반 빌더클래스 이기에 사용하기 정말 쉽다.

실제 프로젝트 때 상품 검색 필터링을 구현하면서 동적쿼리가 필요해 짠 코드이다.
Pageable 을 통해서 페이지네이션도 할수있어서 굉장히 만족했다.
Criteria
QueryDsl 에 비해 복잡하고 가독성도 많이 떨어진다.
설명은 스킵한다.
//Criteria 사용준비
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Member> query = cb.createQuery(Member.class);
//루트 클래스 (조회를 시작할 클래스)
Root<Member> m = query.from(Member.class);
//쿼리 생성
CriteriaQuery<Member> cq =
query.select(m).where(cb.equal(m.get("usernamen), "kim"));
List<Meinber> resultList = em.createQuery(cq).getResultList();Native SQL
nativequery = true 옵션을 설정하면 네이티브 SQL 을 직접 사용 가능하다.
당연히 특정 DB에 의존하기에 DB가 변경되면 해당 쿼리문도 수정해야한다.
JPQL
JPQL 은 별칭을 필수로 한다. JPQL은 클래스 명이 아니라 객체 인티티 명을 기준으로 한다.
페치 조인
SQL의 있는 기능은 아니고 JPQL 에서 성능 최적화를 위해 제공하는 기능이다.
fetch join 을 사용하면 join하는 연관 테이블을 모두 조회한다. 지연로딩을 사용하며
쿼리 최적화를 원할때 자주 사용한다.
한계
JPA 표준에서는패치 조인 대상에게 별칭을 줄수없다.
두 개 이상의 컬렉션을 패치 조인 할수 없다.
컬렉션을 패치조인 하면 페이징 API 를 사용할수없다.
______________________________________________________________________________________
Last updated