[Beyond SW] JPQL

이경민·5일 전

한화시스템 Beyond SW

목록 보기
34/40

JPQL

엔터티 객체를 중심으로 개발할 수 있는 객체 지향 쿼리
JPQL은 find() 메소드를 통한 조회와 다르게 항상 데이터베이스에 SQL을 실행해서 결과를 조회

  1. 작성한 JPQL(문자열)을 entityManager.createQuery() 메소드를 통해 쿼리 객체로 만든다.
  2. 쿼리 객체는 TypedQuery, Query 두 가지가 있다.
    1. TypedQuery : 반환할 타입을 명확하게 지정하는 방식일 때 사용하며 쿼리 객체의 메소드 실행 결과로 지정한 타입이 반환 된다.
    2. Query : 반환할 타입을 명확하게 지정할 수 없을 때 사용하며 쿼리 객체 메소드의 실행 결과로 Object 또는 Object[ ]이 반환 된다.
  3. 쿼리 객체에서 제공하는 메소드 getSingleResult() 또는 getResultList()를 호출해서 쿼리를 실행하고 데이터베이스를 조회한다.
    1. getSingleResult() : 결과가 정확히 한 행일경우 사용하며 없거나 많으면 예외가 발생한다.
    2. getResultList() : 결과가 2행 이상일 경우 사용하며 컬렉션을 반환한다. 결과가 없으면 빈 컬렉션을 반환한다

parameter

  1. 이름 기준 파라미터(named parameters) 바인딩
    : 다음에 이름 기준 파라미터를 지정함
  2. 위치 기준 파라미터(positional parameters) 바인딩
    ? 다음에 위치값을 줌, 위치값은 1부터 시작

projection

(SELECT {프로젝션 대상} FROM) 
  1. 엔터티 프로젝션 : 원하는 객체를 바로 조회할 수 있다. 조회된 엔티티는 영속성 컨텍스트가 관리한다.
  2. 임베디드 타입 프로젝션 : 조회의 시작점이 될 수 없다. (from 절 사용 불가) 임베디드 타입은 영속성 컨텍스트에서 관리되지 않는다.
  3. 스칼라 타입 프로젝션 : 숫자, 문자, 날짜 같은 기본 데이터 타입이다. 스칼라 타입은 영속성 컨텍스트에서 관리되지 않는다.
  4. new 명령어를 활용한 프로젝션 : 다양한 종류의 단순 값들을 DTO로 바로 조회하는 방식으로 new 패키지명.DTO명을 쓰면 해당 DTO로 바로 반환받을 수 있다. new 명령어를 사용한 클래스의 객체는 엔티티가 아니므로 영속성 컨텍스트에서 관리되지 않는다.

임베디드 프로젝션

임베디드 타입(embedded type, 복합 값 타입 또는 내장 타입)
: 새로운 값 타입을 직접 정의한 것으로 주로 기본 값 타입을 모아서 만든 하나의 타입을 말한다
엔티티의 필드 중 일부분을 하나의 임베디드 타입으로 정의하면 알아보기 쉬움
재사용성이 높게 디자인 할 수 있어 유지보수에 용이함

paging

SELECT 결과를 여러 페이지로 나누어 특정 페이지의 데이터만 조회하는 기술
DBMS에 따라 각각 문법이 다른 문제점 -> API를 통해 추상화해서 간단하게 처리

public List<Menu> usingPagingAPI(int offset, int limit) {
  String jpql = "SELECT m FROM Section04Menu m ORDER BY m.menuCode DESC";
  List<Menu> pagingMenuList = manager.createQuery(jpql, Menu.class)
                                      .setFirstResult(offset)
                                      .setMaxResults(limit)
                                      .getResultList();

  return pagingMenuList;
}

groupfunction

  1. 그룹함수의 반환 타입은 결과 값이 정수면 Long, 실수면 Double로 반환된다.
  2. 값이 없는 상태에서 count를 제외한 그룹 함수는 null이되고 count만 0이 된다. 따라서 반환 값을 담기 위해 선언하는 변수 타입을 기본자료형으로 하게 되면, 조회 결과를 언박싱 할때 NPE(NullPointException)가 발생한다.
  3. 그룹 함수의 반환 자료형은 Long 또는 Double 형이기 때문에 Having 절에서 그룹 함수 결과값과 비교하기 위한 파라미터 타입은 Long or Double로 해야한다.

join

  1. 일반 조인 : 일반적인 SQL 조인을 의미한다. (내부 조인, 외부 조인, 컬렉션 조인, 세타 조인 등)
  2. 페치 조인 : JPQL에서 성능 최적화를 위해 제공하는 기능으로 연관 된 엔티티나 컬렉션을 한 번에 조회할 수 있다. 지연 로딩이 아닌 즉시 로딩을 수행하며 JOIN FETCH 명령어를 사용한다.

subquery

where, having 절에서만 사용가능 (select, from 절에서는 사용 불가)

namedquery

동적쿼리 : EntityManager가 제공하는 메소드를 이용하여 JPQL을 문자열로 런타임 시점에 동적으로 쿼리를 만드는 방식을 말한다. 동적으로 만들어질 쿼리를 위한 조건식이나 반복문은 자바 코드를 이용할 수 있다.
정적쿼리 : 미리 쿼리를 정의하고 변경하지 않고 사용하는 쿼리를 말하며 미리 정의한 코드는 이름을 부여해서 사용하게 된다. 이를 NamedQuery라고 한다.

0개의 댓글