JKROH 2023. 3. 30. 21:19
반응형
해당 강의는 코드 위주로 진행됩니다. 실질적인 객체 처리를 담당하는 코드는 링크에서 확인하시길 바랍니다.

* JPQL

  • JPA Query Language
    • SQL 쿼리와 유사하다.
    • 테이블, 칼럼명 대신 엔티티 이름, 속성을 사용한다.

  • 테이블 대신 엔티티인 Review를 사용한다.
  • r.hotelId 는 칼럼명이 아닌 Review의 필드 멤버, 즉 Review의 속성이다.
  • createQuery()의 두 번째 인자로 해당 엔티티 클래스라는 것을 명시한다. 해당 메서드의 결과로 TypedQuery 객체가 생성된다.
  • setParameter();를 통한 파라미터 바인딩이 가능하다. 위의 JPQL문에서 :Property 형태로 쓰인 부분에 바인딩을 해준다.
    • setParameter();의 첫 번째 인자는 바인딩 될 부분 (Property)를 전달한다.
    • 두 번째 인자는 값을 전달한다.
    • 따라서 setParameter(); 의 결과로 위의 조건절은 r.hotelId = 'H-001' 이 된다.
  • TypedQuery 객체 인스턴스의 getReulsList();를 수행하면 실제 SQL문이 실행이 되고 그 결과를 List에 담아 List객체를 만든다.

 

* 기본 사용법

  • JPQL 기본 구조
    • SELECT 별칭 FROM 엔티티명 (AS) 별칭 ...
    • SELECT r FROM Review r
    • SELECT u FROM User u
  • 쿼리 생성
    • TypedQuery<T> EntityManager.createQuery(String jpql, Class<T> resultClass) 
TypedQuery<Review> query = em.createQuery(
    "select r from Review r", //쿼리
    Review.class); //결과 타입
List<Review> reviews = query.getResultList();

 

* 검색 조건 지정

  • SQL과 사실상 거의 같다.
  • where + and, or, 괄호 등
SELECT r FROM Review r WHERE r.hotelId = :hotelId
SELECT r FROM Review r WHERE r.hotelId = ?
SELECT r FROM Review r WHERE r.hotelId = :hotelId and r.mark > :minMark
SELECT p FROM Player p WHERE p.position = :pos or p.tem.id = :teamId
  • ?를 사용하면 위치 기반으로 작동한다. 아래의 인덱스 기반 사용법을 참고하자.
  •  파라미터
    • 이름을 사용한 경우 : query.setParameter("hotelId", "H-001")
    • 인덱스 기반 : query.setParameter(0, "H-001")
TypedQuery<Review> query = em.createQuery(
    "SELECT r FROM Review r WHERE r.hotelId = ?",
    Review.class);
query.setParameter(0, "H-001");

 

* 정렬 순서

  • ORDER BY
    • SELECT  r FROM  Review r ORDER BY r.id
    • SELECT  r FROM  Review r ORDER BY r.id ASC
    • SELECT  r FROM  Review r ORDER BY r.id DESC
    • SELECT  p FROM  Player p ORDER BY p.position, p.name
  • 기본은 오름차순이다.

 

* 비교 연산자

 

* 페이징 처리

  • setFirstResult(int startRow); 를 통해 결과를 읽어올 시작행을 지정할 수 있다.
  • setMaxResult(int limit); 를 통해 최대 결과 갯수를 지정할 수 있다.
  • setFirstResult(int startRow); 는 0부터 시작한다. 아래 예시를 통해 살펴보자.
query.setFirstResult(8);
query.setMaxResult(4);

-->9번째 행부터 4개를 읽어온다.
  • MySQL을 이용하면 limit을 이용해서 페이징 처리를 하게 된다.

 

* 그 외 이런 게 있다 / 된다

  • 잘 사용하지는 않지만 되는 함수들이다.
  • 조인
  • 집합 함수
    • count, max, min, avg, sum
  • group by, having
  • 콜렉션 관련 비교
    • member of, not member of, is empty, is not empty
    • exists, all, any
  • JPQL 함수
    • concat, substring, trim, abs, sqrt
    • 콜렉션 함수 : size, index 등

 

* 정리

  • 모든 경우를 JPA로 처리할 수는 없다. 다음의 경우에는 JPQL 말고 일반 쿼리 사용을 고려하자
    • 여러 테이블을 조인하는 경우.
      • 레거시 테이블 조인
    • DMBS에 특화된 쿼리가 필요한 경우 
      • ex) 오라클 힌트
    • 서브 쿼리가 필요한 경우
    • 통계, 대량 데이터 조회 / 처리를 하는 경
반응형