1. Querydsl
SQL 쿼리문을 문자열이 아닌 소스코드로 작성하도록 지원하는 빌더 API (프레임워크)
2. Querydsl 의 장점
① 고정된 SQL 문이아닌 조건에 맞게 동적으로 쿼리 생성 가능
② 제약 조건 조립 및 가독성 향상
③ 컴파일 시점에 오류를 발견할 수 있음
④ 자동 완성 기능으로 인한 생산성 향상
3. Querydsl 의존성 주입
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>4.3.1</version>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>4.3.1</version>
</dependency>
4. Qdomain 플러그인 추가
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
5. Qdomain 생성
6. JPAQueryFactory 를 이용한 상품 조회
// @PersistenceContext 어노테이션으로 bean 주입
@PersistenceContext
EntityManager em;
// 쿼리를 동적으로 생성하기 위해 JPAQueryFactory 객체 생성 (매개변수로 엔티티 매니저 받음)
JPAQueryFactory queryFactory = new JPAQueryFactory(em);
// Querydsl을 통해 쿼리를 생성하기 위해 Qdomain 객체 생성
QItem qItem = QItem.item;
// querydsl 쿼리문을 받을 JPAQuery 객체 생성
// SQL 문자열이 아닌 자바 소스코드를 이용해 쿼리 생성
// select -> 조회, where -> 조건문, orderBy -> 정렬
JPAQuery<Item> query = queryFactory.selectFrom(qItem)
.where(qItem.itemSellStatus.eq(ItemSellStatus.SELL))
.where(qItem.itemDetail.like("%" + "테스트 상품 상세 설명" + "%"))
.orderBy(qItem.price.desc());
7. 쿼리 전달 및 결과
8. JPAQuery 데이터 반환 메소드
메소드 | 기능 |
---|---|
List<T> fetch() | 조회 결과 리스트 반환 |
T fetchOne() | 조회 결과 대상이 1건인 경우 |
T fetchFirst() | 조회 대상 중 1건만 반환 |
Long fetchCount() | 조회 대상 개수 반환 |
QueryResult<T> fetchResults() | 조회한 리스트와 전체 개수 반환 |
1.Predicate
쿼리문의 where 조건문을 메소드로 정의해놓은 것
2. QuerydslPredicateExecutor 상속
3. QuerydslPredicateExecutor 인터페이스 정의 메소드
메소드 | 기능 |
---|---|
long count(Predicate) | 데이터의 총 개수 반환 |
boolean exists(Predicate) | 데이터 존재 여부 반환 |
Iterable findAll(Predicate) | 모든 데이터 반환 |
Page<T> findAll(Predicate, Pageable) | 조건에 맞는 페이지 데이터 반환 |
Iterable findAll(Predicate, Sort) | 정렬된 데이터 반환 |
T findOne(Predicate) | 조건에 맞는 데이터 1개 반환 |
4. QuerydslPredicateExecutor 를 이용한 상품 조회
// 쿼리문의 where 역할을 수행하는 Predicate 를 담는 객체 생성
BooleanBuilder booleanBuilder = new BooleanBuilder();
// where 조건부 설정
booleanBuilder.and(item.itemDetail.like("%" + itemDetail + "%"));
booleanBuilder.and(item.price.gt(price));
booleanBuilder.and(item.itemSellStatus.eq(ItemSellStatus.SELL));
// 0 번째 페이지, 5개의 데이터
// findAll() 메소드의 매개변수로 predicate, pageable 전달
// 반환된 결과는 Page<Item> 타입으로 받음
Pageable pageable = PageRequest.of(0, 5);
Page<Item> itemPagingResult = itemRepository.findAll(booleanBuilder, pageable);
// 반환된 페이지에서 content 부분만을 List<Item> 타입으로 반ㄷ음
List<Item> resultItemList = itemPagingResult.getContent();
5. 쿼리 전달 및 결과