본문 바로가기

Back-End/QueryDSL

QueryDSL 중급 문법

1. 프로젝션과 결과 반환 - DTO 조회

프로젝션이 둘 이상일 때는 DTO로 반환해주는 것이 좋다.
결과를 DTO로 반환해주는 방법

생성자 사용(제일 많이 쓰는 법이라 이것만 소개할 예정)

List<MemberDto> result = queryFactory
          .select(Projections.constructor(MemberDto.class,
                   member.username,
                   member.age))
          .from(member)
          .fetch();

2. 동적 쿼리 - BooleanBuilder 사용
동적 쿼리를 해결하는 두 가지 방식

  • BooleanBuilder
  • Where 다중 파라미터 사용

2-1) BooleanBuilder

  • BooleanBuilder는 QueryDSL에서 동적 조건을 만들기 위해 사용되는 객체
  • 여러 조건을 조합하거나, 필요 없는 조건은 생략할 수 있는 방식으로 동작
BooleanBuilder builder = new BooleanBuilder();

if (searchDto.getName() != null) {
    builder.and(user.name.eq(searchDto.getName()));
}

if (searchDto.getAge() != null) {
    builder.and(user.age.gt(searchDto.getAge()));
}

List<User> results = jpaQueryFactory.selectFrom(user)
    .where(builder)
    .fetch();

2-2) Where 다중 파라미터

  • QueryDSL에서 where 절에 여러 조건을 Predicate 형식으로 전달하는 방식
  • 이 방식에는 조건 추가를 메서드로 분리해 관리하는 경우가 많다.
public BooleanExpression nameEq(String name) {
	return name != null ? user.name.eq(name) : null;
}

public BooleanExpression ageGt(Integer age) {
    return age != null ? user.age.gt(age) : null;
}

List<User> results = jpaQueryFactory.selectFrom(qUser)
    .where(nameEq(searchDto.getName()), ageGt(searchDto.getAge()))
    .fetch();

Where 다중 파라미터가 다른 쿼리에서도 재활용 할 수 있고 가독성이 높으므로 Where 다중 파라미터를 사용하자!

3. 수정, 삭제 벌크 연산

쿼리 한번으로 대량 데이터 수정

long count = queryFactory
       .update(member)
       .set(member.username, "비회원")
       .where(member.age.lt(28))
       .execute();

기존 숫자에 1 더하기

long count = queryFactory
      .update(member)
      .set(member.age, member.age.add(1))
      .execute();

쿼리 한번으로 대량 데이터 삭제

long count = queryFactory
       .delete(member)
       .where(member.age.gt(18))
       .execute();

주의! JPQL 배치와 마찬가지로, 벌크 연산은 영속성 컨텍스트에 있는 엔티티를 무시하고 실행되기 때문에 배치 쿼리를 실행하고 나면 영속성 컨텍스트를 초기화 하는 것이 안전하다.

'Back-End > QueryDSL' 카테고리의 다른 글

Spring Data Jpa와 QueryDSL  (0) 2025.01.17
JPQL을 QueryDSL로 바꿔보자!  (0) 2025.01.17
QueryDsl 기본 문법  (1) 2024.12.31
QueryDsl 3.x 설정  (0) 2024.12.29