Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[20210630] Querydsl #163

Open
JuHyun419 opened this issue Jun 30, 2021 · 0 comments
Open

[20210630] Querydsl #163

JuHyun419 opened this issue Jun 30, 2021 · 0 comments
Labels

Comments

@JuHyun419
Copy link
Owner

Querydsl 프로젝트 설정(build.gradle)

// plugins에 추가
id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10' // Querydsl

        
// dependencies에 추가
implementation 'com.querydsl:querydsl-jpa'


// 그 아래 추가
def querydslDir = "$buildDir/generated/querydsl"

querydsl {
    jpa = true
    querydslSourcesDir = querydslDir
}

sourceSets {
    main.java.srcDir querydslDir
}

configurations {
    querydsl.extendsFrom compileClasspath
}

compileQuerydsl {
    options.annotationProcessorPath = configurations.querydsl
}
  • build.gradle 파일 갱신 후 compileQuerydsl task 실행

image

image

  • QuerydslPredicateExecutor 인터페이스 추가 상속
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
import org.zerock.guestbook.entity.Guestbook;

public interface GuestbookRepository extends JpaRepository<Guestbook, Long>,
        QuerydslPredicateExecutor<Guestbook> {

}

Querydsl

  • 정적 타입을 이용해서 SQL과 같은 쿼리를 생성할 수 있도록 해주는 프레임워크
  • Querydsl이 제공하는 Fluent API를 이용해서 쿼리 생성 가능
  • 타입에 안전(컴파일 시 문법 오류 확인 가능)
  • 공식 문서(한글)
  • 공식 문서(영어)
  • 검색 & 페이징 처리(BooleanBuilder + BooleanExpression)
    • BooleanBuilder : 쿼리의 WHERE 문에 들어가는 조건들을 넣어주는 컨테이너
  • Querydsl 사용법
    • BooleanBuilder 생성
    • 조건에 맞는 구문은 Querydsl에서 사용하는 Predicate 타입의 함수를 생성
    • BooleanBuilder에 작성된 Predicate를 추가하고 실행
...

    @Test
    @DisplayName("Querydsl로 title 검색 조건을 처리한다.")
    void test_Querydsl1() {
        /* given */
        Pageable pageable = PageRequest.of(0, 10, Sort.by("gno").descending());
        QGuestbook qGuestbook = QGuestbook.guestbook;
        String keyword = "20";
        // BooleanBuilder -> Where 문에 들어가는 조건들을 넣어주는 컨테이너
        BooleanBuilder builder = new BooleanBuilder();

        /* when */
        BooleanExpression expression = qGuestbook.title.contains(keyword);
        builder.and(expression);
        Page<Guestbook> result = guestbookRepository.findAll(builder, pageable);

        /* then */
        result.stream().forEach(System.out::println);
    }

    @Test
    @DisplayName("Querydsl로 다중 항목 검색 조건을 처리한다.")
    void test_Querydsl2() {
        /* given */
        Pageable pageable = PageRequest.of(0, 50, Sort.by("gno").ascending());
        QGuestbook qGuestbook = QGuestbook.guestbook;
        String titleKeyword = "10";
        String contentKeyword = "20";
        BooleanBuilder builder = new BooleanBuilder();

        /* when */
        BooleanExpression exTitle = qGuestbook.title.contains(titleKeyword);
        BooleanExpression exContent = qGuestbook.content.contains(contentKeyword);
        BooleanExpression exAll = exTitle.or(exContent);
        builder.and(exAll);
        builder.and(qGuestbook.gno.gt(0L));

        Page<Guestbook> result = guestbookRepository.findAll(builder, pageable);

        /* then */
        result.stream().forEach(System.out::println);
    }

image

image

  • 동적 처리를 위해 Q도메인 클래스를 얻어옴
    • Q도메인 클래스를 이용하면 엔티티 클래스에 선언된 title, content같은 필드들을 변수로 활용할 수 있음
  • BooleanBuilder는 where문에 들어가는 조건들을 넣어주는 컨테이너
  • 원하는 조건은 필드 값과 같이 결합해서 생성
    • BooleanBuilder 안에 들어가는 값은 com.querydsl.core.types.Predicate 타입이어야 함
  • 만들어진 조건은 where문에 and나 or같은 키워드와 결합
  • BooleanBuilder는 Repository에 추가된 QuerydslPredicateExcutor 인터페이스의 findAll() 메소드 사용
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant