Free Lines Arrow
본문 바로가기
DataBase/JPA

[JPA] JPQL 이란?

by skahn1215 2021. 9. 23.
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

댓글