프로그래밍/spring
[JPA] Spring DATA JPA Querydsl - 3
혀끄니
2023. 7. 19. 09:00
728x90
QuerydslPredicateExecute를 이용한 상품 조회 예제
itemRepository.java
public interface ItemRepository extends JpaRepository<Item, Long>, QuerydslPredicateExecutor<Item> {
}
QueryDslPredicateExecute 인터페이스
ItemRepositoryTest.java
package com.shop.repository;
import com.querydsl.core.BooleanBuilder;
import com.querydsl.jpa.impl.JPAQuery;
import com.querydsl.jpa.impl.JPAQueryFactory;
import com.shop.constant.ItemSellStatus;
import com.shop.entity.Item;
import com.shop.entity.QItem;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.test.context.TestPropertySource;
import org.thymeleaf.util.StringUtils;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.time.LocalDateTime;
import java.util.List;
@SpringBootTest
@TestPropertySource(locations = "classpath:application-test.properties")
class ItemRepositoryTest {
@Autowired
ItemRepository itemRepository;
@PersistenceContext
EntityManager em;
public void createTimeList2(){
for(int i=1 ; i<=5 ; i++){
Item item = new Item();
item.setItemNm("테스트 상품"+i);
item.setPrice(10000+i);
item.setItemDetail("테스트 상품 상세 설명" + i);
item.setItemSellStatus(ItemSellStatus.SELL);
item.setStockNumber(100);
item.setRegTime(LocalDateTime.now());
item.setUpdateTime(LocalDateTime.now());
itemRepository.save(item);
}
for(int i=6; i<=10 ; i++){
Item item = new Item();
item.setItemNm("테스트 상품"+i);
item.setPrice(10000 + i);
item.setItemDetail("테스트 상품 상세 설명" + i);
item.setItemSellStatus(ItemSellStatus.SOLD_OUT);
item.setStockNumber(0);
item.setRegTime(LocalDateTime.now());
item.setUpdateTime(LocalDateTime.now());
itemRepository.save(item);
}
}
@Test
@DisplayName("상품 Querydsl 조회 테스트2")
public void queryDslTest2(){
this.createTimeList2();
//BooleanBuilder는 쿼리에 들어갈 조건을 만들어주는 빌더
//메소드 체인 형식
BooleanBuilder booleanBuilder = new BooleanBuilder();
QItem item = QItem.item;
String itemDetail = "테스트 상품 상세 설명";
int price = 10003;
String itemSellStat = "SELL";
// 필요한 상품을 조회하는데 필요한 "and" 조건을 추가
booleanBuilder.and(item.itemDetail.like("%"+itemDetail+"%"));
booleanBuilder.and(item.price.gt(price));
if(StringUtils.equals(itemSellStat, ItemSellStatus.SELL)){
booleanBuilder.and(item.itemSellStatus.eq(ItemSellStatus.SELL));
}
//데이터를 페이징해 조회하도록 PageRequest.of() 메소드를 이용해 Pageable 객체 생성
//첫번째 인자는 조회할 페이지 번호
//두번째 인가는 한 페이지당 조회할 데이터의 개수
Pageable pageable = PageRequest.of(0,5);
//QueryDslPredicateExecutor 인터페이스에서 정의한 findAll() 메소드를 이용해 조건에 맞는
//데이터를 Page객체로 받아옴
Page<Item> itemPageResult = itemRepository.findAll(booleanBuilder, pageable);
System.out.println("total elements : " + itemPageResult.getTotalElements());
List<Item> resultItemList = itemPageResult.getContent();
for(Item resultItem : resultItemList){
System.out.println(resultItem.toString());
}
}
}
728x90