페이징 처리
JPA는 페이징을 다음과 같이 추상화합니다:
String jpql = "SELECT m FROM Member m ORDER BY m.name DESC";
List<Member> result = em.createQuery(jpql, Member.class)
.setFirstResult(10)
.setMaxResults(20)
.getResultList();
→ 실제 SQL로 번역되어 효율적인 페이징 처리 가능 (LIMIT, OFFSET 등)
JOIN
1. 내부 조인 (INNER JOIN)
// jpql
SELECT m FROM Member m INNER JOIN m.team t
// sql
SELECT m.* FROM Member m JOIN Team t ON m.team_id = t.id
2. 외부 조인 (LEFT JOIN)
// jpql
SELECT m FROM Member m LEFT JOIN m.team t
//sql
SELECT m.* FROM Member m LEFT OUTER JOIN Team t ON m.team_id = t.id
3. 세타 조인 (연관관계 없는 조인)
SELECT COUNT(m) FROM Member m, Team t WHERE m.username = t.name
ON절 활용 (JOIN 필터링)
1. 조건 필터링 조인
SELECT m, t FROM Member m LEFT JOIN m.team t ON t.name = '팀A'
SELECT m.*, t.* FROM Member m LEFT JOIN Team t ON m.team_id = t.id AND t.name = '팀A'
2. 연관 관계가 없는 엔티티 외부 조인
SELECT m, t FROM Member m LEFT JOIN Team t ON m.username = t.name
서브쿼리
JPQL에서는 WHERE / HAVING / SELECT(하이버네이트) 절에서 서브쿼리를 지원합니다 (단, FROM 절 서브쿼리는 불가).
예시 1: 평균보다 나이 많은 회원
SELECT m FROM Member m
WHERE m.age > (SELECT AVG(m2.age) FROM Member m2)
2: 주문한 적 있는 회원
SELECT m FROM Member m
WHERE (SELECT COUNT(o) FROM Order o WHERE o.member = m) > 0
서브쿼리 지원 함수
- [NOT] EXIST: 서브쿼리에 결과가 존재하면 참
- ALL: 모두만족하면 참
- ANY, SOME: 하나라도 만족하면참
- [NOT] IN: 서브쿼리 결과중 하나라도 같은것이 있으면 참
JPQL 타입 표현과 기타
조건식 CASE
기본 CASE
SELECT CASE
WHEN m.age <= 10 THEN '학생요금'
WHEN m.age >= 60 THEN '경로요금'
ELSE '일반요금'
END FROM Member m
단순 CASE
SELECT CASE t.name
WHEN '팀A' THEN '인센티브110%'
WHEN '팀B' THEN '인센티브120%'
ELSE '인센티브105%'
END FROM Team t
JPQL 기본 함수
함수 | 설명 |
CONCAT(a, b) | 문자열 결합 |
SUBSTRING(s, i, len) | 문자열 자르기 |
TRIM(s) | 공백 제거 |
LOWER, UPPER | 소문자/대문자 |
LENGTH(s) | 문자열 길이 |
LOCATE(sub, s) | 위치 검색 |
ABS, SQRT, MOD | 수치 연산 |
SIZE(c) | 컬렉션 크기 |
INDEX(c) | 컬렉션 인덱스 (JPA 전용) |
사용자 정의 함수
SELECT function('group_concat', i.name) FROM Item i
💡 사용자 정의 함수는 DB 방언(Dialect)에 등록 필요 (이미 대부분 등록되어있음) 사용만 하면돼
'프로그래밍 > JPA' 카테고리의 다른 글
[JPA] 프로젝션 (2) | 2025.07.31 |
---|---|
[JPA] JPQL 기본 문법과 기능 (2) | 2025.07.30 |
[JPA] JPQL 소개 (2) | 2025.07.30 |
[JPA] 값 타입 컬렉션 (1) | 2025.07.25 |
[JPA] 값 타입과 불변 객체 (2) | 2025.07.23 |