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 |