JPA 객체지향 쿼리 언어 소개
JPA는 다양한 쿼리 방법을 지원한다.
- JPQL
- JPA Criteria
- QueryDSL
- 네이티브 SQL
- JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용
대부분 JPQL, QueryDSL로 해결한다.
JPQL
SQL을 추상화한 객체 지향 쿼리 언어이다.
SQL과 문법이 유사함. (SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원)
JPQL은 엔티티 객체를 대상으로 쿼리를 수행함.
(SQL은 데이터베이스 테이블을 대상으로 쿼리를 수행함)
SQL을 추상화했기에 특정 DB 문법에 의존하지 않음.
List<Member> result = em.createQuery("select m from Member m where m.username like '%kim%'", Member.class)
.getResultList();
Criteria
JPA 공식 기능이며 JPQL 빌더 역할을 한다.
자바코드로 쿼리문을 작성함.
자바로 작성했기에 동적쿼리로 작성하기 쉽고, 코드가 잘못되면 컴파일 오류가 나기에 쉽게 고치는 장점이 있다.
하지만 너무 복잡하고 실용성이 없어서 굳이 사용한다면 이것 대신에 QueryDSL 사용을 권장한다.
QueryDSL
이것 역시 문자가 아닌 자바코드로 JPQL로 작성 가능하고,
JPQL 빌더 역할을 하며, 컴파일 시점에 문법 오류를 찾을 수 있다.
Criteria처럼 동적 쿼리를 작성하기 편하다.
SQL과 비슷하여 단순하고 쉬우며 실무 사용이 권장된다.
//JPQL
//select m from Member m where m.age > 18
JPAFactoryQuery query = new JPAQueryFactory(em);
QMember m = QMember.member;
List<Member> list = query.selectFrom(m)
.where(m.age.gt(18))
.orderBy(m.name.desc())
.fetch();
사용 전에는 셋팅을 해야해서 위 코드처럼 이런 식으로 쓴다고 생각하면 된다.
네이티브 SQL
JPA가 제공하는 SQL을 직접 사용하는 기능이다.
JPQL로 해결할 수 없는 특정 데이터베이스에 의존적인 기능이다.
(Oracle의 CONNECT BY, 특정 DB만 사용하는 SQL 힌트)
위 코드처럼 사용할 수 있다.
이렇게 주석부분에 사용했다고 나온다.
JDBC 직접 사용, SpringJdbcTemplate 등
JPA로 JDBC 커넥션을 직접 사용하거나 SpringJdbcTemplate, MyBatis 등을 함께 사용 가능하다.
주의할 점은 영속성 컨텍스트를 적절한 시점에 강제로 flush가 필요하다.
자바 ORM 표준 JPA 프로그래밍 / 김영한 지음 / 에이콘출판주식회사 출판
자바 ORM 표준 JPA 프로그래밍 - 기본편 / 김영한 / 인프런 강의