일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Kotlin in action 5장
- 고급매핑
- 기능개발 python
- 객체 지향 설계와 스프링
- Python
- 20055
- Kotlin in action 10장
- 코틸린인액션
- 컨베이어 벨트 위의 로봇 Python
- 백준
- 백준 20055 컨베이어 벨트 위의 로봇
- 코틀린
- 스프링 컨테이너와 스프링 빈
- KotlinInAction
- 7장 고급매핑
- 자바 ORM 표준 JPA 프로그래밍 7장
- 코틀린인액션
- Kotlin in action 6장
- 스프링 핵심 원리
- 스프링 핵심 원리 - 기본편
- Kotlin
- 스프링 핵심 원리 이해
- spring
- 20055 컨베이어 벨트 위의 로봇
- Kotlin in action 3장
- 13460 구슬탈출 2
- kotlin in action 정리
- Kotlin In Action
- 싱글톤 컨테이너
- 백준 13460 Python
- Today
- Total
기록하는 습관
[JPA] 스프링 데이터 JPA (2) 본문
스프링 데이터 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 기능이 정상 동작하지 않음. 큐 소트를 사용하면 되긴하지만 정렬을 직접해줘야 함
'스터디 > 자바 ORM 표준 JPA 프로그래밍' 카테고리의 다른 글
[JPA] 예외 처리와 엔티티 비교 (1) | 2024.01.25 |
---|---|
[JPA] 객체지향 쿼리와 JPQL (1) | 2023.11.09 |
[JPA] 9장 값 타입 (0) | 2023.10.25 |
[JPA] 복합키에서 equals () 및 hashCode () 구현 (0) | 2023.10.05 |