애플리케이션을 개발할려면 데이터를 조회하는 기능은 필수.
쿼리메서드는 스프링 데이터 JPA에서 제공하는 핵심 기능 중 하나로 Repository인터페이스에 간단한 네이밍 룰을 이용하여 메서드를 작성하면 원하는 쿼리를 실행할 수 있다.
find + (엔티티이름) + By + 변수이름
상품의 이름을 이용하여 데이터를 조회
public interface ItemRepository extends JpaRepository<Item, Long> {
List<Item> findByName(String itemNm); // 상품명으로 데이터 조회
}
public void createItemList() {
for( int i=1; i<=10; i++) {
Item item = new Item();
item.setItemNm("테스트 상품" + i);
item.setPrice(10000 + i);
item.setItemDetail("테스트상품 상세"+ i);
item.setItemStatus(ItemStatus.SELL);
item.setStockNumber(100);
item.setRegTime(LocalDateTime.now());
item.setUpdateTime(LocalDateTime.now());
Item savedItem = itemRepository.save(item);
}
}
@Test
@DisplayName("상품명 조회 테스트")
public void findByItemNmTest() {
this.createItemList();
List<Item> itemList = itemRepository.findByItemNm("테스트 상품1");
for(Item item : itemList) {
System.out.println(item.toString());
}
}
OR 조건처리하기
List<Item> findByItemNmOrItemDetail(String itemNm, String ItemDetail);//상품명 또는 상품상세설명을 조회
LessThan 조건처리하기
List<Item> findByPriceLessThan(Integer price);//파라미터로 넘어온 price변수보다 값이 작은 상품데이터 조회
OrderBy로 정렬 처리하기
List<Item> findByPriceLessThanOrderByPriceDesc(Integer price); //상품의 가격이 높은 순으로 조회
public interface ItemRepository extends JpaRepository<Item, Long>,
QuerydslPredicateExecutor<Item> {
List<Item> findByItemNm(String itemNm); // 상품명으로 데이터 조회
List<Item> findByItemNmOrItemDetail(String itemNm, String ItemDetail);//상품명 또는 상품상세설명을 조회
List<Item> findByPriceLessThan(Integer price);//파라미터로 넘어온 price변수보다 값이 작은 상품데이터 조회
List<Item> findByPriceLessThanOrderByPriceDesc(Integer price); //상품의 가격이 높은 순으로 조회
@Query("select i from Item i where i.itemDetail"
+ " like " +
"%:itemDetail% order by i.price desc")
List<Item> findByItemDetail(@Param("itemDetail") String itemDetail);
}
@Query("select i from Item i where i.itemDetail like %:itemDetail% order by i.price desc")
List findByItemDetail(@Param("itemDetail") String itemDetail)
@Query 어노테이션 안에 JPQL로 작성한 쿼리문을 넣어주는데, from 뒤에 엔티티 클래스로 작성한 item을 지정해주고, item으로부터 데이터를 select 하겠다는 의미.
파라미터에 @Param 어노테이션을 이용하여 파라미터로 넘어온 값을 JPQL에 들어갈 변수로 지정할 수있다.
현재는 itemDetail 변수를 "like % %"
사이에 ":itemDetail"
로 값이 들어가도록 작성
import java.time.LocalDateTime;
import java.util.List;
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.test.context.TestPropertySource;
import com.shopping.study.constant.ItemStatus;
import com.shopping.study.entity.Item;
@SpringBootTest
@TestPropertySource(locations="classpath:application-test.properties")
class ItemRepositoryTest {
@Autowired
ItemRepository itemRepository;
@Test
@DisplayName("상품 저장 테스트")
public void createItemTest(){
Item item = new Item();
item.setItemNm("테스트 상품");
item.setPrice(10000);
item.setItemDetail("테스트 상품 상세 설명");
item.setItemStatus(ItemStatus.SELL);
item.setStockNumber(100);
item.setRegTime(LocalDateTime.now());
item.setUpdateTime(LocalDateTime.now());
Item savedItem = itemRepository.save(item);
System.out.println(savedItem.toString());
}
//데이터 생성을 위해서 10개의 상품을 저장
public void createItemList() {
for( int i=1; i<=10; i++) {
Item item = new Item();
item.setItemNm("테스트 상품" + i);
item.setPrice(10000 + i);
item.setItemDetail("테스트상품 상세"+ i);
item.setItemStatus(ItemStatus.SELL);
item.setStockNumber(100);
item.setRegTime(LocalDateTime.now());
item.setUpdateTime(LocalDateTime.now());
Item savedItem = itemRepository.save(item);
}
}
@Test
@DisplayName("상품명 조회 테스트")
public void findByItemNmTest() {
this.createItemList();
List<Item> itemList = itemRepository.findByItemNm("테스트 상품1");
for(Item item : itemList) {
System.out.println(item.toString());
}
}
@Test
@DisplayName("상품명, 상품상세설명 or 테스트 ")
public void findByItemNmOrItemDetail() {
this.createItemList();
List<Item> itemList = itemRepository.findByItemNmOrItemDetail("테스트 상품1", "테스트 상품 상세 설명5");
for(Item item : itemList) {
System.out.println(item.toString());
}
}
@Test
@DisplayName("가격 LessThan 테스트")
public void findByPriceLessThanTest(){
this.createItemList();
List<Item> itemList = itemRepository.findByPriceLessThan(10005);
for(Item item : itemList){
System.out.println(item.toString());
}
}
@Test
@DisplayName("가격 내림차순 조회 테스트")
public void findByPriceLessThanOrderByPriceDesc(){
this.createItemList();
List<Item> itemList = itemRepository.findByPriceLessThanOrderByPriceDesc(10005);
for(Item item : itemList){
System.out.println(item.toString());
}
}
@Test
@DisplayName("@Query를 이용한 상품조회 테스트")
public void findByItemDetailTest() {
this.createItemList();
List<Item> itemList = itemRepository.findByItemDetail("테스트 상품 상세 설명");
for(Item item : itemList) {
System.out.println(item.toString());
}
}
}
상품 데이터 10개가 가격이 높은 슨부터 조회되는 걸 확인할 수 있다