728x90
반응형
JPQL 이란?
- Java Persistence Query Language 이다.
- 객체지향 쿼리 언어다.
- 그렇기 때문에 테이블이 대상이 아니라 엔티티 객체를 대상으로 쿼리한다. - JPQL 은 SQL을 추상화 해서 특정 DB SQL 에 의존하지 않는다.
- JPQL은 SQL로 변환되어 수행된다.
언제 써야 될까?
- 복잡한 쿼리를 조회할때 사용한다.
- 예를 들어 18세 이상회원을 조회 할때 find 로는 한계가 있다.
- 그렇기 때문에 JPQL 을 사용해야된다.
JPQL을 기반으로한 기능들
- JPA Criteria 크레이티어리아
- QueryDSL
- 네이티브 SQL
- JDBC API 직접 사용이 가능하다.
JPQL 예제
- JPQL 은 테이블을 다루는게 아니라 객체를 다룬다.
- m 은 멤버객체를 조회 하라는 뜻이다.
String qlString = "select m from Member m where m.username like '%kim%'";
List<Member> result = em.createQuery(qlString, Member.class).getResultList();
for (Member member : result) {
System.out.println("member =" + member);
}
장점
- 복잡한 쿼리를 지원한다.
단점
- JPQL 은 String 으로 처리 하기 때문에 문법적 오류에 주의 해야 된다.
Criteria
- 실무에서는 사용하지 않는다. 너무 복잡하기 때문이다.
CriteriaBuilder cb = em.getCriteriaBuilder(); // CriteriaBuilder 를 EntityManager 에서 가져온다.
CriteriaQuery<Member> query = cb.createQuery(Member.class); // 멤버에 대한쿼리를 한다.
Root<Member> m = query.from(Member.class);
CriteriaQuery<Member> cq = query.select(m);
// 아래 처럼 동적 쿼리를 짤수 있다.
// 사용자 이름 여부에대해서 동적쿼리를 다음과같이 작성함.
String username = "kim";
if (username != null) {
cq.where().where(cb.equal(m.get("username"),"kim")); // equal 로 비교
}
List<Member> resultList = em.createQuery(cq).getResultList();
장점
- 동적쿼리를 짤 수 있다.
단점
- 쿼리문법 같지가 않다.
- 복잡하다.
QueryDSL
- Criteria 대신 QDSL 을 사용하자
- java 코드로 JPQL 을 작성할 수 있다.
- JPQL 빌더 역할
- 컴파일 시점에 문법 오류를 찾을수 있다.
- 동적쿼리 작성 편리함
- 단순하고 쉽다.
- 실무 사용 권장.
Native SQL
- JPA 가 제공하는 SQL 을 직접 사용하는 기능
- JPQL로 해결할 수 없는 특정 데이터베이스에 의존적인 기능
- JDBC 를 직접 사용할 경우 적절한 시점에 강제로 플러시를 해줘야한다.
- JDBC 는 JPA 와 관련 없기 때문에 영속성 컨텍스트에 있는 데이터를
조회할 방법이 없다 그렇기 때문에 플러시를 해줘야한다.
// Member 로 할 경우 모든 필드가 다 들어가야한다.
List <Member> resultList = em.createNativeQuery("select MEMBER_ID, USER_NAME from Member",Member.class)
.getResultList();
for(Member JPQLMember1 : resultList) {
System.out.println(JPQLMember1.getUserName());
}
728x90
반응형
'DataBase > JPA' 카테고리의 다른 글
[JPA] JPQL 프로젝션 (0) | 2021.09.24 |
---|---|
[JPA] JPQL 문법 (0) | 2021.09.23 |
[JPA] 값타입 컬렉션 (0) | 2021.09.17 |
[JPA] 값타입 (0) | 2021.08.22 |
[JPA] CASCADE (0) | 2021.08.22 |
댓글