객체지향 쿼리 언어 소개


JPA는 다양한 쿼리 방식을 지원합니다.

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

JPQL 소개

  • 가장 간단한 검색 방법
    • EntityManager.find()
    • 개체 그래프를 반복합니다(a.getB().getC())
  • 18세 이상의 모든 회원을 검색하고 싶으신가요?

JPQL

  • JPA를 사용하여 엔터티 개체를 중심으로 개발
  • 문제는 검색어다.
  • 또한 검색할 때 테이블이 아닌 엔터티 개체를 찾습니다.
  • 모든 DB 데이터를 객체로 변환할 수 없음
  • 마지막으로 응용 프로그램이 DB에서 필요한 데이터만 가져오려면 검색 조건이 있는 SQL이 필요합니다.

  • 테이블이 아닌 개체를 검색하는 개체 지향 쿼리
  • SQL을 추상화하고 특정 데이터베이스 SQLX에 의존
  • JPQL의 간단한 정의는 객체 지향 SQL입니다.

기준 소개

//기준을 사용할 준비를 합니다.

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery 쿼리 = cb.createQuery(Member.class);

//루트 클래스(검색할 클래스)
뿌리 m = query.from(Member.class);
// 쿼리 생성
CriteriaQuery cq = query.select(m).where(cb.equal(m.get(“사용자 이름”), “김”));
목록 resultList = em.createQuery(cq).getResultList();

기준 소개

  • JPQL은 텍스트가 아닌 Java 코드로 작성할 수 있습니다.
  • JPQL 빌더 역할
  • JPA 공식 기능
  • 단점: 너무 복잡하고 비실용적입니다.
  • 기준 대신 QueryDSL 추천 용도

QueryDSL 소개

  • JPQL은 텍스트가 아닌 Java 코드로 작성할 수 있습니다.
  • JPQL 빌더 역할
  • 구문 오류는 컴파일 타임에 찾을 수 있습니다.
  • 동적 쿼리 작성의 편의성
  • 간단하고 쉬운
  • 실전 적용 권장

원시 SQL 소개

  • JPA에서 제공하는 SQL을 직접 사용하는 기능
  • JPQL로 처리할 수 없는 특정 데이터베이스에 종속된 기능
  • 예) Oracle CONNECT BY, 특정 DB만 사용하는 SQL 힌트

JDBC, SpringJdbcTemplate 등 직접 사용

  • JPA를 사용하면서 JDBC 연결을 직접 사용하거나 Spring JdbcTemplate, MyBatis 등을 함께 사용할 수 있습니다.
  • 그러나 지속성 컨텍스트는 적절한 시간에 강제로 플러시되어야 합니다.
  • 예) SQL을 실행하기 직전에 JPA를 우회하고 지속성 컨텍스트를 수동으로 플러시