springframework/Spring Data JPA

Spring Datat Common : QueryDSL 변경사항

Jungsoomin :) 2020. 11. 17. 20:02

버전 업으로 인한 QuerydslJpaRepository 의 Deprecated 

  • 의존, 플러그인 설정 maven compile 에 의한 자동생성 클래스는 동일하다.
  • @NoRepositoryBean 을 가진 JpaRepository 상속 인터페이스 설정도 동일
@NoRepositoryBean
public interface MyCommonRepository<T, Id extends Serializable> extends JpaRepository<T, Id> {

    boolean contatins(T entity);

}
  • 기본 커스텀 리포지토리 구현 클래스 설정과 등록은 같으나 상속 구조는 SimpleJpaRepository 를 사용.
public class MyCommonRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T,ID> implements MyCommonRepository<T, ID> {

    private EntityManager entityManager;

    public MyCommonRepositoryImpl(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {
        super(entityInformation, entityManager);
        this.entityManager = entityManager;
    }


    @Override
    public boolean contatins(T entity) {
        return entityManager.contains(entity);
    }
}
@SpringBootApplication
@EnableJpaRepositories(repositoryBaseClass = MyCommonRepositoryImpl.class)
public class JpaApplication {
    public static void main(String[] args) {
        SpringApplication.run(JpaApplication.class, args);
    }
}
  • 실제로 사용할 Repository 에 QuerydslPredicateExecutor<Domain> 사용시 에러가 났으나, 자동으로 구현체를 찾아주게 변경되었음.
public interface PostRepository extends MyCommonRepository<Post, Long>, QuerydslPredicateExecutor<Post> {
}

테스트 코드가 잘 작동함.

@Test
    @Rollback(false)
    public void testQueryDsl(){
        Post post = new Post();
        post.setTitle("Hibernate");
        postRepository.save(post);

        QPost qPost = QPost.post;
        Predicate predicate = qPost.title.containsIgnoreCase("Hi");

        Optional<Post> one = postRepository.findOne(predicate);

        assertThat(one).isNotEmpty();
    }
Hibernate: 
    select
        post0_.id as id1_1_,
        post0_.content as content2_1_,
        post0_.created as created3_1_,
        post0_.title as title4_1_ 
    from
        post post0_ 
    where
        lower(post0_.title) like ? escape '!'
2020-11-17 19:51:11.142 TRACE 9856 --- [           main] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [VARCHAR] - [%hi%]
2020-11-17 19:51:11.155 TRACE 9856 --- [           main] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([id1_1_] : [BIGINT]) - [1]

즉, 기본 커스텀 Repository 등록 후 사용할 Repository 에 QuerydslPredicateExecutor<Domain> 만 추가하면 되겠다.