728x90
JPQL이란?
JPA가 제공하는 SQL을 추상화한 객체 지향 쿼리 언어이다.
SQL과 문법이 유사하며 SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN을 지원
JPQL은 엔티티 객체를 대상으로 쿼리(SQL은 데이터베이스 테이블을 대상으로 쿼리)
SQL을 추상화 했기 때문에 특정 데이터베이스 SQL에 의존하지 않는다.
예시)
//검색
String jpql = "select m from Member m where m.age > 18";
List<Member> result = em.createQuery(jpql, Member.class)
.getResultList();
실행된 SQL select
m.id as id,
m.age as age,
m.USERNAME as USERNAME,
m.TEAM_ID as TEAM_ID
from
Member m
where
m.age>18
Criteria 란?
JPA 공식 기능이며, 문자가 아닌 자바코드로 JPQL을 작성할 수 있는 JPQL의 빌더 역할을 한다.
동적 쿼리 작성 가능하지만, 너무 복잡하고 실용성이 없다.
대신에 QueryDSL 사용을 권장한다.
예시)
//Criteria 사용 준비
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Member> query = cb.createQuery(Member.class);
//루트 클래스 (조회를 시작할 클래스)
Root<Member> m = query.from(Member.class);
//쿼리 생성
CriteriaQuery<Member> cq = query.select(m).where(cb.equal(m.get("username"), “kim”));
List<Member> resultList = em.createQuery(cq).getResultList();
QueryDSL 이란?
문자가 아닌 자바코드로 JPQL을 작성할 수 있는 JPQL의 빌더 역할을 한다.
컴파일 시점에 문법 오류를 찾을 수 있고 동적쿼리 작성이 편리하다.
단순하고 사용이 쉬우며 실무 사용에 권장한다.
예시)
//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로 해결할 수 없는 특정 데이터베이스에 의존적인 기능
- 예) 오라클 CONNECT BY, 특정 DB만 사용하는 SQL 힌트
String sql =
“SELECT ID, AGE, TEAM_ID, NAME FROM MEMBER WHERE NAME = ‘kim’";
List<Member> resultList =
em.createNativeQuery(sql, Member.class).getResultList();
JDBC 직접 사용, SpringJdbcTemplate 등
- JPA를 사용하면서 JDBC 커넥션을 직접 사용하거나, 스프링JdbcTemplate, 마이바티스등을 함께 사용 가능
- 단, 영속성 컨텍스트를 적절한 시점에 강제로 플러시 필요
- 예) JPA를 우회해서 SQL을 실행하기 직전에 영속성 컨텍스트 수동 플러시
728x90
'💻dev > 🌱Java+Spring' 카테고리의 다른 글
JPA | JPQL 문법 뿌시기 - 프로젝션(SELECT), 페이징 API (0) | 2023.05.03 |
---|---|
JPA | JPQL 문법 뿌시기 - 기본 문법, 쿼리 API (0) | 2023.05.03 |
JPA | 예제로 알아보는 값 매핑 (예제 - 6) (0) | 2023.05.02 |
JPA | 예제로 알아보는 영속성 전이 (예제 - 5) (0) | 2023.05.02 |
JPA | 값 타입 컬렉션이란? (저장, 조회, 수정 예제 및 주의사항) (0) | 2023.05.02 |