Fall in IT.

객체지향쿼리언어 JPQL, Criteria, QueryDSL 본문

프레임워크/Spring Data JPA

객체지향쿼리언어 JPQL, Criteria, QueryDSL

D.Y 2016. 3. 27. 23:27

오늘은 JPA에서 사용할 수 있는 객체지향 쿼리언어에 대해서 알아보겠습니다. 


JPA는 복잡한 검색 조건을 사용하여 엔티티 객체를 조회할 수 있는 다양한 쿼리 기술들을 지원합니다. 그 종류로는 아래와 같습니다.



객체지향쿼리언어의 종류와 특징

  • JPQL(Java Persistence Query Language)
    - 데이터베이스 테이블을 대상으로하는 데이터 중심의 쿼리가 아닌 객체를 대상으로 검색하는 객체지향 쿼리
      (엔티티 객체를 조회하는 객체지향 쿼리.)
    - SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다.
    - JPQL은 SQL보다 간단하다.

  • Criteria
    - JPQL을 편하게 작성하도록 도와주는 API, 빌더 클래스모음.
    - 문자가 아닌 query.select(m).where.. 과 같이 프로그래밍 코드로 JPQL을 작성할 수 있어, 컴파일시 에러를 잡아낼 수 있다.
    - IDE를 사용하면 코드 자동완성을 지원한다.
    - 장점도 많지만, 사용하기 복잡하고 어려워 코드의 가독성이 떨어지는 단점도 있다.

  • QueryDSL
    - JPQL을 편하게 작성하도록 도와주는 빌더 클래스 모음, 비표준 오픈소스 프레임워크.
    - Criteria처럼 코드 기반이면서 단순하고 사용하기 쉽다.
    - 코드의 가독성 또한 높다.

  • NativeQuery
    - JPA에서 JPQL 대신 직접 SQL을 사용하는 것을 말한다.
    - 특정 데이터베이스에 의존하는 기능을 사용해야 할 때 사용한다.



객체지향쿼리언어 종류별 Sample Code

  • JPQL(Java Persistence Query Language)
    String jpql = "select m from Member as m where m.student_number = "0991022";
    Member member = em.createQuery(jpql, Member.class).getMember();

  • Criteria
    //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("student_number"), "0991022");
    Member member = em.createQuery(cq).getMember();

  • QueryDSL
    //준비
    JPAQuery query = new JPAQuery(em);
    QMember member = QMember.member;

    //쿼리, 결과조회
    Member member = query.from(member)
                                            .where(member.student_number.eq("0991022"))
                                            .get(member);


참조
  • 자바 ORM 표준 프로그래밍, 김영한 저

모두 즐거운 코딩 하세요~


Comments