기록하는 습관

[JPA] 스프링 데이터 JPA (2) 본문

스터디/자바 ORM 표준 JPA 프로그래밍

[JPA] 스프링 데이터 JPA (2)

로그뉴 2023. 12. 14. 17:00

스프링 데이터 JPA와 QueryDSL 통합

1. QueryDslPredicateExecutor 사용

첫 번째 방법은 다음처럼 리포지토리에서 QueryDslPredicateExecutor를 상속받으면 된다.

 

이제 상품 리포지토리에서 QueryDSL을 사용할 수 있다. 아래 예제는 QueryDSL이 생성한 쿼리 타입으로 장난감이라는 이름을 포함하고 있으면서 가격이 10000~20000원인 상품을 검색한다.

public interface ItemRepository extends JpaRepository<Item, Long>, QueryDslPredicateExecutor<Item> {}
QItem item = QItem.item;
Iterable<Item> result = itemRepository.findAll(
	item.name.contains("장난감").and(item.price.between(10000, 20000))
);

예제의 QueryDslPredicateExecutor 인터페이스를 보면 QueryDSL을 검색조건으로 사용하면서 스프링 데이터 JPA가 제공하는 페이징과 정렬 기능도 함께 사용할 수 있다.

 

public interface QueryDslPredicateExecutor<T> {
	T findOne(Predicate predicate);
    Iterable<T> findAll(Predicate predicate);
    Iterable<T> findAll(Predicate predicate, OrderSpecifier<?>... orders);
    Page<T> findAll(Predicate predicate, Pageable pageable);
    long count(Predicate predicate);
}

지금까지 살펴본 QueryDslPredicateExecutor는 스프링 데이터 JPA에서 편리하게 QueryDSL을 사용할 수 있지만 기능에 한계가 있다. 예를 들어 join, fetch를 사용할 수 없다. 따라서 QueryDSL이 제공하는 다양한 기능을 사용하려면 JPAQuery를 직접 사용하거나 스프링 데이터 JPA가 제공하는 QueryDslRepositorySupport를 사용해야 한다.

 

2. QueryDslRepositorySupport 사용

QueryDSL의 모든 기능을 사용하려면 JPAQuery 객체를 직접 생성해서 사용하면 된다. 이때 스프링 데이터 JPA가 제공하는 QueryDslRepositorySupport를 상속받아 사용하면 조금 더 편리하게 QueryDSL을 사용할 수 있다.

public interface CustomOrderRepository {
	public List<Order> search(OrderSearch orderSearch);
}

 

public class OrderRepositoryImpl extends QueryDslRepositorySupport implements CustomOrderRepository {
	public OrderRepositoryImpl() {
    	super(Order.class);
    }
    
    @Override
    public List<Order> search(OrderSearch orderSearch) {
    	QOrder order = QOrder.order;
        QMember member = QMember.member;
        
        JPQLQuery query = from(order);
        
        if(StringUtils.hasText(orderSearch.getMemberName())) {	
        	query.leftJoin(order.member, member).where(member.name.contains(orderSearch.getMemberName()));
        }
        
        if(orderSearch.getOrderStatus() != null) {
        	query.where(order.status.eq(orderSerach.getOrderStatus()));
        }
        
        return query.list(order);
    }
}

 

 

3. QuerydslReositorySupport 인터페이스

1. Querydsl 3.x 버전을 대상
2. Querydsl 4.x에 나온 JPAQueryFactory로 시작할 수 없음
3. select로 시작할 수 없음 (from으로 시작해야함)
4. QueryFactory 를 제공하지 않음
5. 스프링 데이터 Sort 기능이 정상 동작하지 않음. 큐 소트를 사용하면 되긴하지만 정렬을 직접해줘야 함

 

 

 

 

Comments