중급 문법

slee2·2022년 4월 14일
0

(인프런)Querydsl

목록 보기
4/7

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

프로젝션 대상이 하나

  • 프로젝션 대상이 하나면 탕비을 명확하게 지정할 수 있음
  • 둘 이상이면 튜플이나 DTO로 조회

튜플 조회

DTO 조회

JPQL에서 DTO 조회

  • 지저분함
  • 생성자 방식만 지원함

Querydsl에서 DTO 조회

3가지 방법

  • 프로퍼티 접근(setter)
  • 필드 직접 접근
  • 생성자 사용

프로퍼티 접근

Projections.bean을 통해 접근한다.

  • MemberDto에는 setter가 있어야 한다.
  • setter가 없으면 모든 값이 null 또는 0으로 세팅됨.
  • 기본생성자가 있어야됨(@NoArgsContructor)

필드 직접 접근

Projections.fields를 통해 직접 데이터를 주입한다.

  • 필드에 값을 직접 넣어주므로, setter가 없어도 된다.
  • 필드 이름이 다르면 null 또는 0으로 세팅됨.
  • 기본 생성자 있어야 한다.

참고

필드가 맞지 않더라도, member.username.as("name") 과 같이 설정해주면, fields를 사용해도 값을 잘 가져온다.

age 값을 어떤 값으로 고정하고 싶다면, 위와 같이
JPAExpressions로 서브멤버를 이용하여 고정이 가능하다.

생성자 접근

Projections.constructor

  • 파라미터 값을 받는 생성자가 필요하다.
  • setter가 없어도 된다.

프로젝션과 결과 반환 - @QueryProjection

DTO에 생성자 부분에 @QueryProjection를 넣고,
Gradle에서 compileQuerydsl을 실행하게 되면,
QMemberDto가 빌드에서 생성된다.

그럼 이와 같이 쓰면 값을 넣어줄 수 있다.

가장 안정적인 방법이다.

  • 컴파일 시점에 오류확인가능
  • 따로 설정해야하는 과정이 없음
  • 코드가 간편함

하지만, DTOQuerydsl을 의존해야한다는 점과, Q파일을 생성해야한다는 단점을 가지고 있다.

이를 감안한다면 유용하게 사용할 수 있다. 선택을 해서 사용할 것.

동적 쿼리 - BooleanBuilder 사용

where 문에 넣을 조건들을 BooleanBuilder를 통해 통째로 만든다음에 넣어주는 방식이다.

값이 둘다 있다면, 둘 다 검색 조건에 들어가고, 하나만 들어가면 하나만 검색 조건에 들어간다. 둘다 없으면 그냥 조건없이 검색이 된다.

동적 쿼리 - Where 다중 파라미터 사용

실무에서 정말 자주 사용한다고 하심

  • where조건에 null 값은 무시된다.
  • 메서드를 다른 쿼리에서도 재활용할 수 있다.
  • 쿼리 자체의 가독성이 높아진다.

이와 같이 조합도 가능하다. 다만 null체크를 주의해서 처리해야한다.

수정, 삭제 벌크 연산

em.flush()를 하기 전에는 DB로 연산을 보내지 않으므로,
em.flush() 없이 조회를 하게 되면, 이전 값이 조회되서 나오게 된다.

그러므로 수정을 한 뒤에는 꼭 em.flush(), em.clear()를 하자.

모든 나이에 1씩 더하는 방법이다.
빼기의 경우 add(-1) 이런식으로 작성하면 된다.

삭제하는 방법이다. 위 내용을 보면 18세 이상의 모든 회원을 지우는 것이다.

SQL function 호출하기

SQL function은 JPA와 같이 Dialect(방언)에 등록된 내용만 호출할 수 있다.

어... 잘 모르겠다.

0개의 댓글