블로그

실전 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())

김영한강의Querydsl

spring repository 확장하기 with jpa, querydsl

JpaRepository 상속하는 repository interface 생성자동으로 빈 등록됨해당 repository는 의존주입 시 사용되는 repository public interface BoardRepository extends JpaRepository<Board, Long> {}   Querydsl을 사용하는 Custom Repository 생성 커스텀 리포지터리 interface 생성 public interface BoardRepositoryCustom { List<Object> findAll(); void updateAll(List<Long> ids, Boolean updatedStatus); } BoardRepository(JpaRepository)가 생성힌 Custom repository 또한 상속받도록 추가 public interface BoardRepository extends JpaRepository<Board, Long>, BoardRepositoryCustom {}   커스텀 리포지터리 확장 클래스 생성JPAQueryFactory는 별도로 빈등록 필요네이밍 시 repository + Impl 규칙을 사용하면 자동으로 빈등록 됨. @RequiredArgsConstructor public class BoardRepositoryImpl implements BoardRepositoryCustom{ private final EntityManager em; private final JPAQueryFactory jpaQueryFactory; @Override public List<BoardResponseDto> findAll(){ List<BoardResponseDto> results = jpaQueryFactory.select( Projections.constructor(BoardResponseDto.class, board.id, board.boardType, board.title, board.content, user.id, user.name, board.recruitingCnt, board.startDate, board.endDate, board.createdDate ) ) .from(board) .innerJoin(board.writer, user) .fetch(); return new results; } @Override public void updateAll(List<Long> ids, Boolean updatedStatus) { jpaQueryFactory.update(board) .set(board.updatedStatus, updatedStatus) .where(board.id.in(ids)) .execute(); em.flush(); em.clear(); } }  

다형성interfaceJPAQuerydsl확장repository