스프링 데이터 JPA-12.QueryDSL(스프링 데이터 Common)


스프링 데이터 Common: QueryDSL

findByFirstNameIngoreCaseAndLastNameStartsWithIgnoreCase(String firstName, String lastName) … 너무 길다..

여러 쿼리 메소드는 대부분 두 가지 중 하나.

  • Optional findOne(Predicate): 이런 저런 조건으로 무언가 하나를 찾는다.
  • List|Page|.. findAll(Predicate): 이런 저런 조건으로 무언가 여러개를 찾는다.
  • QuerydslPredicateExecutor 인터페이스

QueryDSL

  • http://www.querydsl.com/
  • 타입 세이프한 쿼리 만들 수 있게 도와주는 라이브러리
  • JPA, SQL, MongoDB, JDO, Lucene, Collection 지원
  • QueryDSL JPA 연동 가이드

스프링 데이터 JPA + QueryDSL

  • 인터페이스: QuerydslPredicateExecutor
  • 구현체: QuerydslPredicateExecutor

연동 방법

  • 기본 리포지토리 커스터마이징 안 했을 때. (쉬움)
  • 기본 리포지토리 커스타마이징 했을 때. (해맬 수 있으나… 제가 있잖습니까)

의존성 추가

        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-apt</artifactId>
        </dependency>
        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-jpa</artifactId>
        </dependency>

            <plugin>
                <groupId>com.mysema.maven</groupId>
                <artifactId>apt-maven-plugin</artifactId>
                <version>1.1.3</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>process</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>target/generated-sources/java</outputDirectory>
                            <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

QuerydslPredicateExecutor 를 구현해야 한다.

public interface PostRepository extends MyRepository<Post, Long>, QuerydslPredicateExecutor<Post> {
}
    @Test
    public void crud(){
        Post post = new Post();
        post.setTitle("hibernate");
        postRepository.save(post.publish()); // AbstractAggregateRoot 구현 registerEvent

        Predicate predicate = QPost.post.title.containsIgnoreCase("HIB");
        Optional<Post> one = postRepository.findOne(predicate);
        assertTrue(one.isPresent());

    }





© 2019. by jaeuk