스프링 데이터 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());
}