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) 권장 방법
- 매개변수를 바인딩할 때에는 이름 기반 바인딩을 사용하는 것을 권장한다.
- 위치 기반 바인딩을 사용하면 중간에 새로운 매개변수를 추가하는 경우, 순서가 밀리기 때문이다.
- 또한 숫자를 통해서 어떤 위치의 매개변수가 무엇을 의미하는지 쉽게 파악할 수 없다.
- 즉, 가독성이 떨어져 유지보수 상황에서 비효율적이다.
'Back-end > JPA 개념' 카테고리의 다른 글
25. JPQL - 페이징 (0) | 2022.04.25 |
---|---|
24. JPQL - 프로젝션(Projection, Select) (0) | 2022.04.22 |
22. JPQL - JPQL에 대하여 (0) | 2022.04.20 |
21. 값 타입(4) - 값 타입과 컬렉션 (0) | 2022.04.19 |
20. 값 타입(3) - 객체 비교와 equals() 재정의 (0) | 2022.04.18 |
댓글