실전 Querydsl(김영한) 1
문법countcolumn.sum avg max minjoin, orderBy, groupBy, having()eq, in, isNull(), between, goefetch, 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 쿼리 호출 -> deprecatedfetchCount와 fetch로 Page 생성 가능또는 직접 count 쿼리 + select list 쿼리 조합다음은 필요할 때만 count 쿼리 실행하는 코드PageableExecutionUtils.getPage(content, pageable, () -> countQuery.fetchCount())