TIL - 20250801

juni·2025년 8월 1일

TIL

목록 보기
81/316

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)

  • 평균 나이가 20~25살인 그룹을 조회
factory.select(idol.group.groupName, idol.age.avg())
       .from(idol)
       .groupBy(idol.group)
       .having(idol.age.avg().between(20, 25))
       .fetch();

▶ DTO Mapping

  1. 개개가 지정한 from(Tuple) 메서드 이용
  2. 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 학습

0개의 댓글