JPA_Chap10-1_객체지향 쿼리 언어

윤일권·2023년 5월 30일
0

JPA

목록 보기
7/11

JPQL

  • JPQL은 객체지향 쿼리 언어 -> 테이블을 대상으로 쿼리하는 것이 아니라 엔티티 객체를 대상으로 쿼리.
  • JPQL은 SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않음.
  • JPQL은 결국 SQL로 변환.

기본 문법과 쿼리 API

  • 대소문자 구분
  • 엔티티 이름 -> @Entity(name="XXX")로 지정
  • 별칭은 필수

TypeQuery, Query

  • JPQL을 실행하려면 쿼리 객체 만들어야함 -> 쿼리 객체는 TypeQuery와 Query가 존재, 반환할 타입이 명확하면 TypeQuery사용.

파라미터 바인딩

  • 이름 기준 파라미터
    • 이름 기준 파라미터는 파라미터를 이름으로 구분 -> 이름 기준 파라미터는 앞에 : 를 사용.
  • 위치 기준 파라미터
    • 위치 기준 파라미터를 사용하려면 ? 다음에 위치 값을 주면 됨.
  • 위치 기준 파라미터 방식보다는 기름 기준 파라미터 바인딩 방식을 사용하는 것이 더 명확.

프로젝션

SELECT 절에 조회할 대상을 지정하는 것.

  • 엔티티 프로젝션
    • 원하는 객체를 바로 조회한 것. -> 컬럼 하나하나 나열해서 조회해야 하는 SQL과는 차이가 있다.
    • 조회한 엔티티는 영속성 컨텍스트에서 관리된다.
  • 임베티드 타입 프로젝션
    • 임베티드 타입은 엔티티 타입이 아닌 값 타입이다.
    • 직접 조회한 임베디드 타입은 영속성 컨텍스트에서 관리되지 않는다.
  • 스칼라 타입 프로젝션
    • 숫자, 문자, 날짜와 같은 기본 데이터 타입
  • 여러 값 조회
    • Query사용
  • NEW명령어
    • SELECTE다음에 NEW 명령어를 사용하면 반환받을 클래스를 지정할 수 있는데 이 클래스의 생성자에 JSQL 조회 결과를 넘겨줄 수 있다.
    • 패키지 명을 포함한 전체 클래스 명을 입력해야한다.
    • 순서와 타입이 일치하는 생성자가 필요하다.

페이징 API

  • setFirstResult(int startPosition) : 조회 시작 위치-> 0부터 시작
  • setMaxResults (int maxResult) : 조회할 데이터 수

집합과 정렬

  • 집합 : 집합함수와 함께 통계 정보를 구할 때 사용.
  • 집합 함수 사용 시 참고사항
    • NULL 값은 무시하므로 통계에 잡히지 않는다.
    • 만약 값이 없는데, SUM AVG MAX MIN 함수를 사용하면 널 값이 된다.
    • DISTINCT를 집합 함수 안에 사용해서 중복된 값을 제거하고 나서 집합을 구할 수 있다.
    • DISTINCT를 COUNT에서 사용할 때 임베디드 타입은 지원하지 않는다.

JPQL 조인

  • 내부 조인 : INNER JOIN
    • JPQL 은 조인 명령어 다음에 조인할 객체의 연관 필드를 사용.
  • 외부 조인 : 기능상 SQL의 외부 조인과 같다.
  • 컬렉션 조인 : 일대다 관계나 다대다 관계처럼 컬렉션을 사용하는 곳에 조인하는 것을 컬렉션 조인이라 한다.
  • 세타 조인 : WHERE절 사용. 내부 조인만 지원

페치 조인

  • JSQL에서 성능 최적화를 위해 제공하는 기능
  • 엔티티 페치 조인
  • 컬렉션 페치 조인
  • 페치 조인과 DISTINCT : SQL에 DISTINCT를 추가하는 것은 물론이고, 애플리케이션에서 한 번 더 중복을 제거.
  • 페치조인과 일반조인의 차이점
    • JPQL은 결과를 반환할 때 연관관계까지 고려하지 않는다. 단지 SELECT 절에 지정한 엔티티만 조회.

서브 쿼리

서브 쿼리를 WHERE, HAVING 절에서만 사용할 수 있고, SELECT,FROM 절에서는 사용할 수 없다.

  • 조건식

Criteria

  • JPQL을 자바 코드로 작성하도록 도와주는 빌더 클래스 API
  • JPA가 공식 지원하는 기능이지만 직관적이지 않고 사용하기에 불편하다.
  • CriteriaBuilder.createQuery() 메소드로 쿼리 생성
  • 조회 -> 한건 : select, 여러 건 : multiselect
  • 함수 정리

!

  • Criteria 메타 모델 API
    -> Criteria는 코드 기반이므로 컴파일 시점에 오류를 발견할 수 있다. 때문에 정확한 컴파일 시점에서 에러를 검출하여 완전한 코드 기반으로 작성하려면 메타 모델 API를 사용하면 된다.
profile
생각하는 개발자가 되겠습니다!!

0개의 댓글