JVM/JPA

스프링 데이터 JPA와 QueryDSL 통합

kyoulho 2023. 7. 2. 16:17

QueryDslPredicateExecutor

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

하지만 join, fetch를 사용할 수 없다.

// 상속
public interface ItemRepository
	extends JpaRepository<Item, Long>, QueryDslPredicateExecutor<Itme>{}
// 사용
QMember member = QMember.member;
Iterable<Member> result = memberRepository.findAll(
        member.name.contains("김").and(member.age.between(10, 20))
);
public interface QuerydslPredicateExecutor<T> {

	Optional<T> findOne(Predicate predicate);
	Iterable<T> findAll(Predicate predicate);
	Iterable<T> findAll(Predicate predicate, Sort sort);
	Iterable<T> findAll(Predicate predicate, OrderSpecifier<?>... orders);
	Iterable<T> findAll(OrderSpecifier<?>... orders);
	Page<T> findAll(Predicate predicate, Pageable pageable);
	long count(Predicate predicate);
	boolean exists(Predicate predicate);
	<S extends T, R> R findBy(Predicate predicate, Function<FluentQuery.FetchableFluentQuery<S>, R> queryFunction);
}

 

QueryDslRepositorySupport

이 방법은 QueryDsl은 사용할 수 있지만 스프링 데이터 JPA의 기능을 다 사용할 수 없다.

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(orderSearch.getOrderStatus()));
        }
        
        return query.list(order);
    }
}

 

사용자 정의 리포지토리 사용하기

하나의 리포지토리만 주입 받아 사용하므로 편리함이 있지만 코드가 분산되어 있다는 단점이 존재한다.

가장 많이 사용하는 방법이다.

public interface MemberRepositoryCustom{
	List<Member> search(String name);
}

@Repository
@RequiredArgsConstructor
public interface MemberRepositoryImpl implements MemberRepositoryCustom {

	private final JPAQueryFactory jpaQueryFactory;
    
    @Overrider
    public List<Member> search(String name){
    }
}

public MemberRepository extends JpaRepository<Member, Long>, MemberRepositoryCustom {}


memberRepository.search("김");
memberRepository.save(new Member());

'JVM > JPA' 카테고리의 다른 글

@Converter  (0) 2023.07.02
컬렉션  (0) 2023.07.02
스프링 데이터 JPA  (0) 2023.07.02
객체지향 쿼리 심화  (0) 2023.06.30
스토어드 프로시저(JPA 2.1)  (0) 2023.06.30