JPA는 다양한 쿼리 방법을 지원한다.
1. JPQL
2. JPA Criteria
3. QueryDSL
4. 네이티브 SQL
JQPL은 jpa에서 제공하는 표준 문법을 의미한다.
JPA Criteria와 QueryDSL은 java 코드로 JPQL을 생성하는 생성 클래스 라고 생각하면 된다.
네이티브 SQL은 특정 데이터베이스에 종속적인 쿼리가 나가야할 때 사용하는 것인데, postgreSQL 에서만 지원하는 문법을 사용하고자 할 때 네이티브 SQL을 사용하는 것이다.
JPA를 사용하며 JDBC API나 MyBatis, SpringJdbcTemplate도 함께 사용이 가능하기에 jpql로 해결할 수 없는 문제라면 같이 사용하여 해결할 수도 있다.
* 단 적절한 시점에 영속성 컨텍스트의 flush가 필요하다. (jpa에서 관리되는 쿼리가 아니기 때문)
JQPL 소개
jpql을 사용하지 않고 엔티티를 찾는 가장 단순한 조회 방법은 지금까지 Entity Manager를 통해 em.find로 엔티티를 찾는 것이었다.
그런데 만약 나이가 18살 이상인 회원을 모두 검색하고 싶다면? 우린 어떻게 해야할까
이런 경우 하나를 찍어서 가져올 수 있는게 아니기에 JPQL을 사용해야 한다.
jpa는 엔티티 객체를 중심으로 모든 코드가 이뤄져 있다. 그렇다면 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색을 해야하는데 이를 위해 엔티티 객체를 중심으로 쿼리를 지원하는 JPQL이 만들어진 것이다.
SQL과 문법이 유사하며 select, from, where, group by, having, join을 지원한다.
SQL을 추상화 했기 때문에 특정 데이터베이스 SQL에 의존하지 않는다.
QueryDSL 소개
List<Member> result = queryFactory
.select(m)
.from(m)
.where(m.name.like("kim"))
.fetch();
위 코드는 QueryDSL의 예시이다. 알아보기 편하고, 오타를 내도 컴파일시 오류로 잡힌다는 큰 장점이 있다.
- 문자가 아닌 자바 코드로 JPQL을 작성할 수 있다.
- JPQL에 대한 빌더 역할을 한다.
- 컴파일 시점에 문법 오류를 찾을 수 있다.
- 동적 쿼리 작성이 편리하다.
- 단순하고 쉬워 실무 사용에 권장한다.
네이티브 SQL 소개
- JPA가 제공하는 SQL을 직접 사용하는 기능이다.
- JPQL로 해결할 수 없는 특정 데이터베이스에 의존적인 기능을 사용할 때 활용한다.
EX) 오라클의 Connect By, 특정 DB만 사용하는 SQL 힌트 등
String Sql= "select * from member where name = 'kim'";
em.createNativeQuery(sql,Member.class).getResultList();
위와 같이 정말 쌩 SQL문을 작성해서 집어넣으면 된다.
참고: 김영한 자바 ORM 표준 JPA 프로그래밍 - 기본편
'spring > JPA' 카테고리의 다른 글
[JPA] 객체 지향 쿼리 언어 JPQL 6 (fetch join의 한계, 다형성 쿼리) (0) | 2024.08.06 |
---|---|
[JPA] 객체 지향 쿼리 언어 JPQL 5 (경로 표현식, fetch join) (0) | 2024.08.04 |
[JPA] 객체 지향 쿼리 언어 JPQL 4(기본 문법 - 조인, 서브쿼리, 조건식 , 기본 함수) (0) | 2024.08.03 |
[JPA] 객체 지향 쿼리 언어 JPQL 3 (기본 문법 - 프로젝션, 페이징) (0) | 2024.07.31 |
[JPA] 객체 지향 쿼리 언어 JPQL 2 (기본 문법) (4) | 2024.07.29 |