본문 바로가기
Back-end/JPA 개념

23. JPQL - 기본 기능(파라미터 바인딩, 결과 조회, 쿼리의 종류)

by devraphy 2022. 4. 21.

0. 개요

- 이전 포스팅에서 JPQL에 대해서 전반적으로 알아보았다.

- 이번 포스팅에서는 JPQL의 기본 문법과 기능에 대해서 알아보자. 

 

 

1. 기본 규칙

- JPQL은 다음과 같은 기본 규칙을 준수해야 한다.

 

   1. JPQL은 DB 테이블이 아닌 객체(= Entity)를 대상으로 작성한다.

   2. Entity를 사용할 때에는 테이블 명칭이 아닌 Entity 이름을 사용한다. 

   3. Entity 속성을 작성할 때, 대소문자를 구분하므로 주의해야 한다.

   4. JPQL 키워드(= select, from, where 등)는 대소문자를 구분하지 않는다.

   5. 별칭은 필수로 사용하며, as는 생략 가능하다. 

 

 

2. 집합과 정렬

- JPQL은 ANSI 표준에 의해 정의된 SQL 문법을 모두 지원한다.

 

- 집합과 정렬에는 다음과 같은 문법이 있다. 

  → COUNT(), MIN(), MAX(), SUM(), AVG(), GROUP BY(), ORDER BY(), HAVING()

 

 

3. 쿼리의 종류

- JPQL에서 작성되는 쿼리는 TypeQuery와 Query로 구분된다. 

 

a) TypedQuery

- TypeQuery는 반환형이 명확할 때 사용하는 쿼리다. 

TypedQuery<Member> query = em.createQuery("SELECT m from Member m", Member.class);

 

 

- TypedQuery는 매개변수에 객체 클래스 정보가 들어간다.

- 이처럼 반환형이 확실한 경우, TypedQuery를 사용한다.

 

 

b) Query

- Query는  반환형이 명확하지 않을 때 사용하는 쿼리다.

Query query = em.createQuery("SELECT m.username, m.age from Member m");

 

- Query는 매개변수에 객체 클래스 정보가 들어가지 않는다.

- 더불어, 위의 쿼리문을 살펴보면 String 형인 username과 int형인 age를 가져오는 것을 확인할 수 있다.

- 이처럼 반환형이 불확실한 경우, Query를 사용한다. 

 

 

4. 결과 조회 API

- 결과 조회 API란, JPQL에서 쿼리를 통한 결과를 받을 때 사용하는 메서드를 말한다.

 

a) query.getResultList()

- 쿼리로부터 반환된 결과가 하나 이상인 경우, 리스트를 반환하는 메서드다.

- 결과가 존재하지 않는 경우, 비어있는 리스트를 반환한다.

 

 

b) query.getSingleResult()

- 쿼리로부터 반환된 결과가 단 하나인 경우, 단일 객체를 반환하는 메서드다.

- 결과가 존재하지 않는 경우, NoResultExecption이 발생한다.

- 결과가 둘 이상인 경우, NonUniqueResultException이 발생한다. 

 

 

5.  파라미터 바인딩

- 쿼리에 작성되는 특정 속성을 매개변수로 매핑하는 것을 말한다.

- 쿼리에 매개변수를 매핑하는 방식에는 이름을 기준으로 하는 방식과 위치를 기준으로 하는 방식이 있다.

- 다음 코드를 보면서 사용 방법을 이해해보자. 

 

a) 이름 기반 바인딩

Query query = em.createQuery("select m from Member m where m.username =: username")
                .setParameter("username", usernameParam);

 

- 이름 기준 바인딩은 =: 연산자를 사용한다.

- 위의 예시 코드에서 확인할 수 있듯이, 메서드 체이닝을 사용할 수 있다. 

 

 

b) 위치 기반 바인딩

Query query = em.createQuery("select m from Member m where m.username =? 1")
                .setParameter(1, usernameParam);

 

- 위치 기준 바인딩은 =? 연산자를 사용한다. 

- 위의 예시 코드에서 확인할 수 있듯이, 메서드 체이닝을 사용할 수 있다. 

 

 

c) 권장 방법

- 매개변수를 바인딩할 때에는 이름 기반 바인딩을 사용하는 것을 권장한다.

- 위치 기반 바인딩을 사용하면 중간에 새로운 매개변수를 추가하는 경우, 순서가 밀리기 때문이다. 

- 또한 숫자를 통해서 어떤 위치의 매개변수가 무엇을 의미하는지 쉽게 파악할 수 없다.

- 즉, 가독성이 떨어져 유지보수 상황에서 비효율적이다. 

댓글