[JPA #4] JPQL과 쿼리 언어들
[JPA #4] JPQL과 쿼리 언어들
주요 키워드
- JPQL
- QueryDSL
- Criteria
- 네이티브 SQL
- SpringJdbcTemplate
객체지향 쿼리 언어(JPQL)
- JPA는 엔티티 객체 중심 개발을 지향
- 검색 시에도 테이블이 아닌 엔티티 객체를 기준으로 탐색
- 결국 SQL처럼 조건을 걸 수 있는 쿼리 언어가 필요 → JPQL 사용
- SQL과 문법 유사, ANSI 표준 SQL 문법 대부분 지원
- 특정 DB에 종속되지 않음
- 단점: 문자열 기반이기 때문에 동적 쿼리 작성이 어렵다
Criteria
- 동적 쿼리 작성 가능
- 자바 표준 API, 컴파일 시점 오류 확인 가능
- 단점: 코드 복잡도 매우 높음 → 유지보수 어려움
- 실무에서는 Criteria 대신 QueryDSL 사용 권장
QueryDSL
- 자바 코드로 SQL처럼 쿼리 작성 가능
- 문법 오류를 컴파일 타임에 잡을 수 있음
- 동적 쿼리 작성이 매우 편리
- 문법이 단순하고 명확 → 실무에서 가장 많이 사용
네이티브 SQL
- JPQL로 해결 불가능한 DB 종속 쿼리를 작성할 때 사용
- 성능 튜닝, 특정 DB 함수 등을 사용할 경우 필요
SpringJdbcTemplate
- JDBC 커넥션을 직접 사용 가능
- 영속성 컨텍스트 동기화를 위해 수동 플러시 고려 필요
JPQL 문법 요약
- 엔티티 이름, 속성 이름은 대소문자 구분 (Member, age)
- JPQL 키워드는 대소문자 구분 없음 (select, from 등)
- 테이블명이 아닌 엔티티명 사용
- 별칭(alias) 지정 필수 (
as
생략 가능)
1
select m from Member m where m.age > 20
- TypedQuery: 반환 타입이 명확할 때 사용
- Query: 반환 타입이 불분명할 때 사용
결과 조회 메소드
getResultList()
- 결과가 0개 이상일 때 사용
- 결과 없음 → 빈 리스트 반환
getSingleResult()
- 결과가 정확히 1개일 때 사용
- 없음:
NoResultException
- 2개 이상:
NonUniqueResultException
파라미터 바인딩
- 이름 기준 (
:username
) 또는 위치 기준 (?1
) - 이름 기준 사용 권장
프로젝션
select
절에서 조회할 대상을 지정- 조회 대상:
- 엔티티
- 임베디드 타입
- 스칼라 타입 (숫자, 문자열 등 기본 타입)
페이징 API
setFirstResult(int startPosition)
→ 0부터 시작하는 조회 시작 위치 설정setMaxResults(int maxResult)
→ 조회할 최대 개수 설정
사용자 정의 함수 호출
- Hibernate 사용 시, 방언(dialect)에 해당 함수 등록 필요
경로 표현식
- 연관 관계를 탐색할 때 사용
- 묵시적 조인 발생에 주의 (성능 저하 유발 가능)
This post is licensed under CC BY 4.0 by the author.