[JPA] 페이징, 조인, 서브쿼리 등 :: 잡다한 프로그래밍
반응형

페이징 처리

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

+ Recent posts