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'
조인 시점에 조인 대상을 필터링한다
'스터디 > 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 |