프로젝션과 결과 반환 - 기본
select절에서 가져올 것을 지정해서 가져오는 것을 프로젝션이라 한다.
프로젝션 대상이 하나인 경우
Code
튜플 조회
프로젝션 대상이 둘 이상일 때
com.querydsl.core.Tuple
Code
프로젝션과 결과 반환 - DTO 조회
위에서 select 절에서 대상을 지정(프로젝션)해서 가져오고 싶을때 그 대상이 둘 이상이면 Tuple로 가져왔었다.
하지만, 그 외 계층으로 가져갈 때는 DTO로 가져가는게 좋다. 우선 순수 JPA를 이용해서 DTO로 조회하는 코드를 작성해보겠습니다.
MemberDto
Code
Querydsl 빈 생성(Bean pupulation)
결과를 DTO반환할 때 사용하며 3가지 방법이 존재한다.
•
프로퍼티 접근
•
필드 직접 접근
•
생성자 사용
프로퍼티 접근 - Setter
Code
필드 직접 접근
Code
필드 직접 접근 - 별칭이 다를 때
Code
생성자 사용
Code
프로젝션과 결과 반환 - @QueryProjection
프로젝션결과를 반환할 DTO에 @QueryProjection 을 생성자에 붙혀준 뒤 gradle→tasks→other→compileQuerydsl 을 통해 DTO도 Q타입으로 생성해 준다.
생성자 + @QueryProjection
Code
@QueryProjection 활용
Code
distinct 사용
Code
참고: distinct 는 JPQL의 distinct와 같다.
동적 쿼리 - BooleanBuilder 사용
예전 순수 JPA에서 동적 쿼리를 해결하는 방법으로 3가지가 있다고 했다.
1.
문자열 조합 → 조건에 따라 문자열을 결합하면서 query문을 만들고 parameter를 세팅해주는 방법
2.
JPA Criteria → JPA 표준 스펙에서 제공하는 기능.
3.
queryDSL → 오픈소스를 통해 제공되는 기능으로 쿼리구현을 method로 한다.
여기서 3번 queryDSL을 사용해서 동적 쿼리를 해결하는 방식은 자세히 들어가면 또 두가지 방식이 있다.
1.
BooleanBuilder
2.
Where 다중 파라미터 사용
BooleanBuilder 사용
Code
동적 쿼리 - Where 다중 파라미터 사용
Where 다중 파라미터 사용
Code
메서드들을 조합해서 사용 할 수도있다.
Code
수정, 삭제 벌크 연산
쿼리 한번에 대량 데이터 수정
Code
기존 숫자에 1 더하기
Code
쿼리 한번에 대량 데이터 삭제
Code
참고: JPQL 배치와 마찬가지로, 영속성 컨텍스트에 있는 엔티티를 무시하고 실행되기 때문에 배치 쿼리를
실행하고 나면 영속성 컨텍스트를 초기화 하는 것이 안전하다.
SQL function 호출하기
SQL function은 JPA와 같이 Dialect에 등록된 내용만 호출할 수 있다.
Replace function 사용해보기
Code
lower function 사용해보기
Code