프로그래밍/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