객체지향쿼리 언어(JPQL) (표준문법)
JPQL
-가장 단순한 조회방법
-EntityManager.find()
-객체 그래프 탐색(a.getB().getC())
-JPA를 사용하면 엔티티객체를 중심으로 개발
-문제는 검색쿼리를 작성하는 쿼리
-검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색
-모든 DB데이터를 객체로 변환해서 검색하는 것은 불가능
-애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요
-JPA는 SQL을 추상화한 JPQL이라는 객체지향쿼리언어를 제공
-SQL과 문법이 유사하다 , select ,from , where , group by , having , join 문법 지원
-JPQL은 엔티티 객체를 대상으로 쿼리를 작성
-SQL은 DB테이블을 대상으로 쿼리
ex)
em.createQuery("select m from Member m where m.username like '%kim%'" , Member.class).getResultList();
위와 같은 JPQL을 작성하면 JPA가 SQL로 번역해 준다.
SQL과 차이점
1.Table이 아닌 Entity를 대상으로 쿼리를 작성
테이블이 아닌 객체를 대상으로 검색하는개체지향쿼리이다.
SQL을 추상화 해서 특정 데이터베이스 SQL에 의존하지 않는다.
JPQL을 한마디로 정의하면 객체지향전용 SQL
JPQL은 String형태로 존재해서 동적 쿼리 작성이 어렵다.
그래서 동적쿼리를 작성해야 하는 타이밍이 문제이다.
Criteria(동적 쿼리 작성에 용이) (실무에서 사용안함)
문자(String)가 아닌 자바코드로 JPQL 작성가능
-JPA 공식기능
-단점 매우 복잡하고 실용성이 없다.
그래서 Query DSL을 사용한다.
JPAFactoryQuery query = new JPAQueryFactory(em);
QMember m = QMember.Member;
List<Member> list = query.selectFrom(m);
.where(m.age , gt(18))
.order By(m.name , desc())
.fetch();
SQL과 사용법이 유사하다
동적쿼리에도 용이하고 , 재사용성도 높다.
-문자가 아닌 자바코드로 JPQL을 작성할 수 있음
-JPQL빌더역활
-컴파일 시점에 문법오류를 찾을 수 있음
-동적쿼리 작성 편리함
-단순하고 쉬움
-실무 사용환경에 적합.
네이티브 SQL
-JPA가 제공하는 SQL을 직접 사용하는 기능
-JPQL로 해결할 수 없는 특정 데이터베이스에 의존적인 기능
ex) 오라클 외 connect By 등 특정 SQL 문법
JDBC 직접 사용 , spring jdbc Template
-JPA를 사용하면서 JDBC커넥션을 직접 사용하거나
스프링 JDBCTemplate , 마이바티스등을 함께 사용 가능
*단 영속성 컨텍스트를 적절한 시점에 강제로 flush 필요
ex) JPA를 우회해서 SQL을 실행하기 직전에 영속성 컨텍스트 수동 flush
영속성 flush = commit , query 작동시 동작
그래서 쿼리를 실행시 강제로 flush()를 해줘야 정상작동된다.
'JPA' 카테고리의 다른 글
| 2월 13일 JPA JPQL 프로젝션(받는값 매핑) (0) | 2023.02.13 |
|---|---|
| 2월 13일 JPA JPQL(java persistence query language) (0) | 2023.02.13 |
| 2월 9일 JPA 실전예제 6 값 타입 매핑 (0) | 2023.02.09 |
| 2월 9일 JPA 값 타입을 엔티티로 승급 (0) | 2023.02.09 |
| 2월 9일 JPA 값타입 컬렉션 조회 예제 지연로딩 전략사용 (0) | 2023.02.09 |