Search
Duplicate

중급 문법

프로젝션과 결과 반환 - 기본

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