Programming/JPA & Spring Data JPA 기초
18. JPQL 소개
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) 오라클 힌트
- 서브 쿼리가 필요한 경우
- 통계, 대량 데이터 조회 / 처리를 하는 경
- 여러 테이블을 조인하는 경우.
반응형