(spring)(실전! Querydsl_02)

전성영·2022년 8월 1일
0

spring

목록 보기
24/31

프로젝션 - 기본

tuple은 repopsitory 안에서만 사용할 때 쓰는 것을 권장!
만약 외부로 나가야 한다면 Dto 고고!!

프로젝션 - DTO

먼저 JPQL 에서는 어떻게 쓸까?
전에도 정리했다시피 앞에 파일 경로를 다 적어줘야 한다!

자 그럼 이제 중요한 Dto 사용법 세 가지를 알아보자!!

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

1. 프로퍼티 접근(setter)

setter를 통해 값이 들어가기 때문에 dto에 빈 생성자가 필요하다.

2. 필드 접근

field에 직접적으로 바로 때려버리는 사용법이다.

3. 생성자 접근

다들 비슷비슷하다.

번외?

MemberDto -> UserDto로 바꾼 상황이다.
UserDto 필드는 username이 아닌 name . 즉 Member 필드의 이름인 username과 다른 상황이다.
그럴 때에는 .as() 를 활용하여 진행해주면 된다.
.as()를 사용하지 않을 시 null!!!!!!!!!!!!!!!!

@QueryProjection

적용 방법은 블로그에 정리 할 예정이다! 매우 간단하다!!

컴파일러로 타입을 체크할 수 있으므로 가장 안전한 방법이다.
하지만 DTO에 QueryDSL 어노테이션을 유지해야 하는 점과 DTO까지 Q 파일을 생성해야 하는 단점이 있다.

동적 쿼리

BooleanBuilder

BooleanBuilder 객체인 builder 안에 동적으로 데이터를 집어 넣는 것이다.
그 후 where 절에 넣는다.

ex) 이름이 들어오면 이름에 관한 조건만, 나이만 들어오면 나이에 관한 조건만, 둘 다 들어오면 두 가지에 해당하는 조건 다.

and 이외에도 or도 된다!

where절


where이 더 깔끔하고 직관성이 좋다!

더 좋은것은 조립을 할 수 있다.
먼저 조립을 하기 위해서는 Predicate -> BooleanExpression으로 바꿔줘야 한다.

또 조립에 그치지 않고 재활용이 가능하다!


!! 그럼 BooleanExpression과 Predicate 차이는? !!
BooleanExpression은 null 일때 무시될 수 있고, and또는 or절을 통해서 조합을 할 수 있다. Predicate는 단순 true or false 조건문 정도에 사용하는 걸로 생각된다.

But 이해를 못한다 나는.. 고로 더 찾아봤다.
아래 예시를 보고 이해가 갔다. 갓영한..

@Testvoid
testQuery() {
    JPAQueryFactory query = new JPAQueryFactory(em);
    QMember member = QMember.member;
    query.select(member).from(member).where(eq(member).and(...));
}

private Predicate eq(QMember member) {
    return member.salary.eq(10);
}

where(eq(member).and(...) 이 부분에서 error가 난다. Predicate로 가져온 친구에서 .and를 못하는 거 같다!

수정, 삭제 벌크 연산

수정과 삭제를 한 번에 할 수 있는 것이 벌크연산이다.
fetch() 대신 execute로 실행이 된다.

List<Member>result = queryFactory
	.selectFrom(member)
    .fetch();

위 사진 아래에 해당 코드를 삽입 후 실행 시켜도 반영되지 않는다.
이유는 영속성 컨텍스트는 같은 ID 값의 동일한 엔티티가 1차 캐시에 존재한다면, SELECT 되어 결과가 늦게 조회되더라도 늦게 들어온 데이터를 버린다.
위와 같은 현상을
REPEATABLE READ(같은 쿼리를 여러번 실행하도 같은 결과를 내는 것)
이라고 한다.

해결하는 방법은 .flush(), .clear()로 벌크 연산 후 영속성 컨텍ㄱ스트를 깔끔히 지우는 것이다.

수정, 삭제

SQL function 호출하기

기본적으로 Dialect에 등록되어 있는 sql 함수만 사용이 가능하다.
org.hibernate,duakect 패키지 안에 정의되어 있다.

H2Dialect를 검색해서 타고 들어가면 찾아볼 수 있다.

만약 직접 등록해서 사용하고 싶다면 H2Dialect를 상속 받은 후 .properties에 등록해서 사용하면 된다!!


sqlFunction은 주석에서 보시는 것과 같이 replace를 하는 함수이다.

sqlFunction2는 주석되어있는 where 절과 사용하고 있는 where절의 의미가 같다.

모든 디비에서 다 쓸 수 있는 일반화 되있는 함수들은 dsl이 내장하고 있다.
따라서 .lower()로 사용할 수 있다.

여기까지 중급문법 챕터이다.
다음 블로그는 실무 활용 챕터를 묶어서 정리 할 예정이다!

profile
Slow and Steady

0개의 댓글