본문으로 바로가기

[Spring] 실전! Querydsl - 2

category Spring 2021. 9. 9. 18:25

https://www.inflearn.com/course/Querydsl-%EC%8B%A4%EC%A0%84

 

실전! Querydsl - 인프런 | 강의

Querydsl의 기초부터 실무 활용까지 한번에 해결, 본 강의는 자바 백엔드 개발의 실전 코스를 완성하는 마지막 강의 입니다. 스프링 부트와 JPA 실무 완전 정복 로드맵을 우선 확인해주세요. 로드

www.inflearn.com

 

※ 중급 문법

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

- tuple은 여러개의 칼럼을 닮기 위한 자료형 (com.querydsl.core 패키지 안에 있음)

- tuple은 repository에서만 사용하는게 베스트 (다른 계층에서 사용하지 않도록, 의존하지 않게 하는것 권장)

 > dto로 바꿔서 전달하자

 

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

- 1. setter 사용

 > Projections.bean(MemberDto.class, member.username, member.age) 로 진행

 > dto에 기본 생성자 필요 , 기본생성자 통해 생성 후, setter를 통해 주입

 > 프로퍼티 명이 완전히 같아야함

- 2.filed

   > Projections.fields(MemberDto.class, member.username, member.age) 로 진행

  > 기본 생성자 및 setter 필요 없음

  > 필드 명이 완전히 같아야함

    >>. member.username.as("name") 로 해결

   >> ExpressionUtils.as( ~~~ , "aliaa") 로 해결

- 3. constructor

  > Projections.constructor(MemberDto.class, member.username, member.age) 로 진행

  > 파라미터의 타입을 잘 맞춰야함

 

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

- dto의 생성자에 @QueryProjection을 달아준다.

- 컴파일시 q객체가 생겨나며, new DTO()로 바로 프로젝션할 수 있다.

- 단점은 컴파일시 에러를 찾을 수 없다. (런타임 오류로 확인남), q파일을 생성해야함

  dto가 QueryProjection을 querydsl로 부터 import해야해서 의존성이 추가됨

 

ㅁ 동적쿼리 - BooleanBuilder 사용

- builder 도 and, or 조건 가능

- 생성자에 기본으로 꼭 들어가야할 조건도 설정 가능

    private List<Member> searchMember1(String usernameCond, Integer ageCond) {
        BooleanBuilder builder = new BooleanBuilder();
        if(usernameCond != null){
            builder.and(member.username.eq(usernameCond));
        }
        if(ageCond != null){
            builder.and(member.age.eq(ageCond));
        }
        return queryFactory
                .selectFrom(member)
                .where(builder)
                .fetch();
    }

 

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

- 메소드 생성을 통해 Predicate ( or BooleanExpression) 반환

 > null 일 경우, where( null, ) 처리를 통해 처리 가능

- 조합을 할 수도 있다.

 > 굉장히 큰 장점임

- 쿼리 자체의 가독성이 높아짐

- null 체크는 주의해서 처리해야함

 

ㅁ 수정, 삭제 배치 쿼리

- 업데이트 후, 영속성 컨텍스트가 우선권이 있기 때문에 clear 후 재조회해야함

- 속성 업데이트 같은 경우 아래와 같이 진행 ( multiply도 가능 )

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

ㅁ SQL function 호출하기

- dialect 설정하여 함수를 호출할 수 있음

-Expressions.stringtemplate("function~~) 으로 설정

- ansi 표준에 정의된 함수 (ex) lower)는 아래와 같이 호출 가능

//                .where(member.username.eq(Expressions.stringTemplate("function('lower',{0})", member.username)))
                .where(member.username.eq(member.username.lower()))

'Spring' 카테고리의 다른 글

[Spring] ThymeLeaf 정리 - 1  (0) 2021.11.22
[Spring] 실전! Querydsl - 3  (0) 2021.09.13
[Spring] 실전! Querydsl - 1  (0) 2021.09.09
[Spring] 실전! 스프링 데이터 JPA - 3  (0) 2021.09.06
[Spring] 실전! 스프링 데이터 JPA - 2  (0) 2021.09.03