JPA에서 쿼리하는 다양한 방법들을 살펴본다.
-JPQL
-JPA Criteria
-QueryDSL
-네이티브 SQL
-JDBC API 직접 사용
-MyBatis
-SpringJdbcTemplate 사용
JPQL
- 가장 단순한 조회 방법이다.
EntityManger.find()
객체 그래프 탐색(a.getB().getC())
나이가 18살 이상인 회원을 모두 검색하고 싶다면?
select m from Member as m where m.age > 18
JPA를 사용하면 엔티티 객체를 중심으로 개발한다.
검색을 할 때 테이블이 아닌 엔티티 객체를 대상으로 검색한다.
모든 DB데이터를 객체로 변환해서 검색하는 것은 불가능하다.
결국 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하다.
JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공한다.
SELECT, FROM, GROUP BY, HAVING, JOIN 지원한다.
SQL은 데이터베이스 테이블을 대상으로 쿼리, JPQL은 엔티티 중심의 쿼리이다.
List<Member> result =
em.createQuery("select m From Member m where m.username like '%kim%'", Member.class).getResultList();
테이블이 아닌 객체를 대상으로 검색한다.
특정 데이터베이스 SQL에 의존하지 않는다.
JPQL = 객체 지향형 SQL
Criteria
Mybatis의 장점은 동적쿼리이다. JPQL은 동적쿼리가 굉장히 지저분한다. 따라서 보완해서 나온것이 Criteria이다. 하지만 너무 복잡하고 실용성이 없어 운영에 사용하지 않는다. 자바코드로 JPQL을 작성할 수 있다. JPA 공식 기능이다. QueryDSL 사용 권장한다.
QMmeber m = Qmember.member;
List<Member> result = queryFactory
.select(m)
.from(m)
.where(m.name.like("kim"))
.orderBy(m.id.desc())
.fetch();
Query DSL
컴파일 시점에서 문법 오류를 잡아준다. 동적쿼리 작성이 편리하다. 단순하고 쉬워서 실무 사용 권장한다.
네이티브 SQL
JPA가 제공하는 SQL을 직접 사용한다 JPQL로 해결할 수 없는 경우 사용한다.
(예를들어, 오라클 CONNECT BY, 특정 DB만 사용하는 SQL 힌트)
List<Mmeber> resultList =
em.createNativeQuery("select member_id, city, street, zipcode, username from member", Member.class).getResultList();
JPA를 사용하면서 JDBC 커넥션을 직접 사용하거나, JdbcTemplate, Mybatis 등을 함께 사용할 수 있다.
단, 영속성 컨텍스트를 적절한 시점에서 강제로 플러시해야한다.
(JPA를 우회해서 SQL을 실행하기 직전에 영속성 컨텍스트를 수동 플러시해야한다.)
JPQL 문법
엔티티와 속성은 대소문자 구분한다. ( Member ,age )
JPQ 키워드는 대소문자 구분 X(SELECT, FROM ,WHERE)
엔티티 이름 사용, 테이블 이름이 아님(Member)
별칭은 필수(m) (as는 생략 가능)
TypeQuery : 반환타입이 명확할 때
Query : 반환타입이 명확하지 않을 때
'학습 > DB' 카테고리의 다른 글
db Transaction(롤백처리) (0) | 2021.09.26 |
---|---|
JPA 값 타입 (0) | 2021.09.18 |
Oracle DML GRANT, REVOKE 사용하기 (0) | 2021.09.01 |
Query Method (0) | 2021.08.29 |
Spring Data Repository Interface (0) | 2021.08.29 |