0801 QueryDSL Grouping & Join, SQL ROLLUP / CUBE
◼ 조회 데이터 목적
- QueryDSL을 이용해 구현과 조회를 만들는 학습
- 여러 구문 (Group by, Having, Join, DTO mapping, case)를 입체 학습
◼ 테스트 시작 전 데이터 입력
- 아이돌(Idol), 그룹(Group), 앨범(Album)과 관련 데이터 추가
- 여러 그룹에 따라 아이돌을 할당하고, 앨범과 관련을 조정
◼ 조회 예제
▶ SELECT 여부가 그리고 다양한 역할을 수행
- Tuple이 아이돌의 이름과 나이 등 값을 가지고 있음
- 예)
List<Tuple> idolList = factory.select(idol.idolName, idol.age).from(idol).fetch();
▶ groupBy + sum, count
factory.select(idol.group.groupName, idol.count())
.from(idol)
.groupBy(idol.group.id)
.fetch();
▶ groupBy + having (avg + between)
factory.select(idol.group.groupName, idol.age.avg())
.from(idol)
.groupBy(idol.group)
.having(idol.age.avg().between(20, 25))
.fetch();
▶ DTO Mapping
- 개개가 지정한
from(Tuple) 메서드 이용
- QueryDSL의
Projections.constructor() 이용
▶ CASE 문 + groupBy
- 나이를 기준으로 10대, 20대, ... 로 그룹하는 것
NumberExpression<Integer> ageGroup = new CaseBuilder()
.when(idol.age.between(10,19)).then(10)
.when(idol.age.between(20,29)).then(20)
...
◼ Join 학습
▶ Inner Join
factory.select(idol)
.from(idol)
.innerJoin(idol.group, group).fetchJoin()
.fetch();
▶ Left Join
factory.select(idol)
.from(idol)
.leftJoin(idol.group, group).fetchJoin()
.fetch();
▶ Join + groupBy
▶ Join 해석 예제
- 2022년에 발매된 앨범이 있는 아이돌의 정보 조회
◼ SQL ROLLUP / CUBE 배열
- Oracle·MySQL·PostgreSQL 같은 SQL에서 ROLLUP과 CUBE 사용가능
- ROLLUP: 수정가 가능한 계층\uubc30열
- CUBE: 모든 경우의 계층 결과 보기
SELECT
user_id,
post_type,
SUM(view_count) AS total_views
FROM POSTS
GROUP BY ROLLUP(user_id, post_type)
✅ 요약 정보 정리
- QueryDSL의 groupBy, having, case, join을 통해 다양한 조회 형식을 학습
- Tuple의 이용과 DTO의 조회 데이터 mapping 방식을 따라 두 가지 방식을 모두 사용
- 계층 형 구조와 배열 수정을 위한 ROLLUP과 CUBE 학습