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);
// 쿼리 생성
CriteriaQuerycq = 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를 우회하고 지속성 컨텍스트를 수동으로 플러시