본문 바로가기

스터디/JPA

객체지향 쿼리 언어 - (3)

728x90
반응형

JPQL - (2)


페이징 API

데이베이스마다 페이징을 처리하는 SQL 문법이 다르다

 

JPA는 페이징을 다음과 같이 추상화한다

  - setFirstResult(int startPosition): 조회 시작 위치(0부터 시작한다)

  - setMaxResults(int maxResult): 조회할 데이터 수

TypeQuer<Member> query = 
	em.createQuery("SELECT m FROM Member m ORDER BY m.username DESC",
	Member.class);
	
query.setFirstResult(10);
query.serMaxResult2(20);
query.getResultList(); //11번 부터 20건의 데이터를 조회한다

 

페이징 SQL을 더 최적화하고 싶다면 JPA가 제공하는 페이징 API가 아닌 네이티브 SQL을 사용해야 한다

집합과 정렬

집합은 집합함수와 함께 통계 정보를 구할 때 사용한다

 

 

집합함수

 

COUNT, MAX, MIN, AVG, SUM이 있다

 

null 값은 무시하므로 통계에 잡히지 않는다

값이 없는데 집합함수를 사용하는 경우 null이 된다 (COUNT는 0이 된다)

 

DISTINCT를 집합 함수 안에 사용해서 중복된 값을 제거한 후 집합을 구할 수 있다

select COUNT(DISTINCT m.age) form Member m

 

 

 

GROUP BY, HAVING

 

GROUP BY는 통계 데이터를 구할 때 특정 그룹끼리 묶어준다

 

HAVING은 GROUP BY로 그룹화한 통계 데이터를 기준으로 필터링한다

 

SELECT t.name. COUNT(m.age), SUM(m.age), AVG(m.age), MAX(m.age), MIN(m.age)
FROM Member m LEFT JOIN m.team t
GROUP BY t.name
HAVING AVG(m.age) >= 10

위와 같은 쿼리를 리포팅 쿼리 혹은 통계 쿼리라고 한다

 

보통 통계 쿼리는 전체 데이터를 기준으로 처리하므로 실시간으로 사용하기엔 부담이 많다

-> 통계 결과만 저장하는 테이블을 별도로 만들어 새벽에 쿼리를 실행하고 저장해두는 것이 좋다

 

 

ORDER BY

 

결과를 정렬할 때 사용한다

select m from Member m order by m.age DESC, m.username ASC
select t.name, COUNT(m.age) as cnt
from Member m LEFT JOIN m.team t
GROUP BY t.name
ORDER BY cnt

 

 

JPQL 조인

 

내부 조인

 

INNER JOIN을 사용한다

INNER은 생략가능하다

 

연관필드를 사용한다

 

select m from Member m inner join m.team t where t.name = :teamName

Member가 가지고 있는 연관필드로 team과 조인한다

 

 

외부 조인

select m from Member m left join m.team t

 

 

 

컬렉션 조인

 

컬렉션을 사용하는 곳에 조인하는 것을 의미한다

 

select t, m from Team t left join t.members m

팀과 팀이 보유한 회원 목록을 컬렉션 값 연관 필드로 외부 조인했다

 

 

세타 조인

 

where 절을 사용해 세타 조인을 할 수 있다

 

세타 조인은 내부 조인만 지원한다

 

세타 조인을 사용하면 전혀 관계없는 엔티티도 조인할 수 있다

select count(m) from Member m, Team t
where m.username = t.name

 

 

JOIN ON 절

 

on 절을 사용해 조인 대상을 필터링하고 조인할 수 있다

 

내부 조인의 on 절은 where 절을 사용하는 것과 결과가 같아 on 절은 주로 외부 조인에서 사용한다

select m, t 
from Member m left join m.team t on t.name='A' 

 

조인 시점에 조인 대상을 필터링한다

728x90
반응형

'스터디 > JPA' 카테고리의 다른 글

객체지향 쿼리 언어 - (5)  (0) 2025.02.18
객체지향 쿼리 언어 - (4)  (0) 2025.02.18
객체지향 쿼리 언어 - (2)  (0) 2025.02.17
객체지향 쿼리 언어 - (1)  (0) 2025.02.16
값 타입 - (2)  (0) 2025.02.16