자바 ORM 표준 JPA 프로그래밍 - 객체지향 쿼리 언어1

서은경·2022년 12월 7일
0

Java

목록 보기
19/19

소개

👿 JPA 문제점

  • 가장 단순한 조회 방법
    -EntityManager.find()
    -객체 그래프 탐색(a.getB().getC())
  • JPA를 사용하면 엔티티 객체를 중심으로 개발
  • 문제는 검색 쿼리
  • 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색
  • 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능
  • 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요

😇 해결법

  • JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공
  • SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원
  • JPQL은 엔티티 객체를 대상으로 쿼리 / SQL은 데이터베이스 테이블을 대상으로 쿼리 (JPQL을 짜면 SQL로 번역이 되어 실행이 됨)

JPA는 다양한 쿼리 방법을 지원

  • JPQL
  • JPA Criteria
  • QueryDSL
  • 네이티브 SQL
  • JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용

JPQL

👍 장점

  • 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리
  • SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않음
  • JPQL을 한마디로 정의하면 객체 지향 SQL

👎 단점

  • 단순 문자열이므로 동적 쿼리를 생성하기 어려움

Criteria

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Member> query = db.createQuery(Member.class);

Root<Member> m = query.from(Member.class);

query.select(m).where(cb.equal(m.get("username"), "kim"));
List<Member> resultList = em.createQuery(dq).getResultList();

👍 장점

  • 오타 대비가 쉬움(코드로 쿼리를 짜는 거라 컴파일 시점에 캐치함)
  • 동적 쿼리를 짜기 용이함
  • 문자가 아닌 자바코드로 JPQL을 작성할 수 있음
  • JPQL 빌더 역할, JPA 공식 기능

👎 단점

  • SQL스럽지 않다
  • 실무에서 사용하지 않음
  • 너무 복잡하고 실용성이 없다

QueryDSL

👍 장점

  • 문자가 아닌 자바코드로 JPQL을 작성할 수 있음
  • JPQL 빌더 역할
  • 컴파일 시점에 문법 오류를 찾을 수 있음
  • 동적 쿼리 작성 편리함
  • 단순하고 쉬움
  • 실무 사용 권장

네이티브 SQL

  • JPA가 제공하는 SQL을 직접 사용하는 기능
  • JPQL로 해결할 수 없는 특정 데이터베이스에 의존적인 기능

기본 문법과 쿼리 API

  • SQL과 거의 유사함

프로젝션

  • SELECT 절에 조회할 대상을 지정하는 것
  • 프로젝션 대상 : 엔티티, 임베디드 타입, 스칼라 타입(숫자, 문자 등 기본 데이터 타입)

여러값 조회

  1. Query 타입으로 조회
    -TypeQuery
    -Query
  2. Object[] 타입으로 조회
  3. new 조회
    -단순값을 DTO로 바로 조회
    -패키지 명을 포함한 전체 클래스 명 입력
    -순서와 타입이 일치하는 생성자 필요

페이징

JPA는 페이징을 다음 두 API로 추상화

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

조인

  • 내부조인 (inner)
  • 외부조인 (outer)
  • 세타조인

조인 - ON 절

  • ON 절을 활용한 조인 (JPA 2.1부터 지원)
    1. 조인 대상 필터링
    1. 연관관계 없는 엔티티 외부 조인(하이버네이트 5.1부터)

서브쿼리

서브쿼리 지원 함수

  • EXIST
  • ALL | ANY | SOME
  • IN

서브쿼리의 한계

  • JPA는 WHERE, HAVING 절에서만 서브 쿼리 사용 가능
  • SELECT 절도 가능 (하이버네이트에서 지원)
  • FROM 절의 서브쿼리는 현재 JPQL에서 불가능 (조인으로 풀 수 있으면 풀어서 해결)

JPQL 타입 표현과 기타식

타입표현

  • 문자 : 'HELLO', 'She'
  • 숫자 : 10L(Long), 10D(Double), 10F(Float)
  • Boolean : TRUE, FALSE
  • ENUM : jpabook.~~ 패키지명 포함
  • 엔티티 타입 : TYPE(m) = Member (상속 관계에서 사용)
    ex) select i from item i where type(i) = Book;

기타

  • SQL과 문법이 같은 식
  • EXISTS, IN
  • AND, OR, NOT
  • =, >, >=, <, <=, <>
  • BETEWWN, LIKE, IS NULL

조건식(CASE 등등)

JPQL 함수

0개의 댓글

관련 채용 정보