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());
728x90
'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 |