실전 Querydsl(김영한) 1

  • 문법
    count
    column.sum avg max min
    join, orderBy, groupBy, having()
    eq, in, isNull(), between, goe
    fetch, fetchOne, fetchResults

 

  • 조인
    join(innerJoin), leftJoin, fetchJoin
    연관관계 없는 세타 조인 from(member, team) - on절 사용 가능(leftJoin)
    세타조인이 leftJoin으로 진행될 경우 별칭사용 안 함

 

  • 서브쿼리
    JPAExpressions - static으로 사용하기
    QMember memberSub = QMember("memberSub")로 엔티티 별칭으로 참조

 

  • 기타
    assertThat(result).extracting("age").containsExactly(30)
    case문 - when().then().otherwise()

 

  • 프로젝션
    • Projections.bean(MemberDto.class, member.username, member.age)
      setter 필요
    • Projections.field()
    • Projections.constructor()
      DTO 생성자에 @QueryProjection 붙여서 사용
      as 또는 ExpressionUtils로 dto 필드명에 맞추기

 

  • 동적쿼리
    BooleanBuilder builder
    • if(arg != null)
      builder.add(member.username.eq(arg))
    • jpaQueryFactory.selectForm().where(builder)

where 다중 파라미터 -> 쿼리 조립 재활용 가능
- Predicate, BooleanExpressions 사용
- null 주의

 

  • 기타
    update().set(member.age, member.age.add(1))
    delete().where(member.age.gt(10))
    sql function 사용 가능 ex) DATE_FORMAT

 

  • 조회 API 컨트롤러
    jpaRepository.search(condition)
    MemberSearchCondition dto @QueryProjections
    쿼리스트링만으로 쿼리 자동생성 & 검색 기능 사용 가능

 

  • 사용자 정의 리포지토리
    CustomRepositoryImpl
    interface CustomRepository
    extends MemberRepository(== JpaRepository)

 

  • 페이징
    offset limit fetchResults => list, count 쿼리 호출 -> deprecated
    fetchCount와 fetch로 Page 생성 가능
    또는 직접 count 쿼리 + select list 쿼리 조합

    다음은 필요할 때만 count 쿼리 실행하는 코드
    PageableExecutionUtils.getPage(content, pageable, () -> countQuery.fetchCount())

댓글을 작성해보세요.