package com.shop.entity;
import com.shop.constant.ItemSellStatus;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import javax.persistence.*;
import java.time.LocalDateTime;
@Getter
@Setter
@ToString
@Entity
@Table(name="item")
public class Item {
@Id
@Column(name="item_id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id; // 상품 코드
@Column(nullable = false, length = 50)
private String itemNm; // 상품명
@Column(name="price", nullable = false)
private int price; // 가격
@Column(nullable = false)
private int stockNumber; // 재고 수량
@Lob
@Column(nullable = false)
private String itemDetail; // 상품 상세 설명
@Enumerated(EnumType.STRING)
private ItemSellStatus itemSellStatus; // 상품 판매 상태
private LocalDateTime regTime; // 등록 시간
private LocalDateTime updateTime; // 수정 시간
}
메서드 이름으로 query를 생성하는 방식
package com.shop.repository;
import com.shop.entity.Item;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface ItemRepository extends JpaRepository<Item, Long> {
// 상품명으로 데이터 조회
List<Item> findByItemNm(String itemNm);
// 상품명 또는 상품 상세 설명으로 데이터 조회
List<Item> findByItemNmOrItemDetail(String itemNm, String itemDetail);
// 상품 가격이 주어진 가격보다 작은 상품 데이터 조회
List<Item> findByPriceLessThan(Integer price);
// 상품 가격 기준 내림차순 조건 추가
List<Item> findByPriceLessThanOrderByPriceDesc(Integer price);
}
특정 조건을 추가한 조회 기능 구현
findBy
로 시작하여 조건을 추가된 메서드를 repository interface에 추가
조건 추가 시 entity 필드의 이름과 동일하게 하며, 첫 글자는 대문자로 변경하여 사용
@Autowired
ItemRepository itemRepository;
List<Item> itemList1 = itemRepository.findByItemNm("name");
List<Item> itemList2 = itemRepository.findByItemNmOrItemDetail("name", "description");
List<Item> itemList3 = itemRepository.findByPriceLessThan(100000);
List<Item> itemList4 = itemRepository.findByPriceLessThanOrderByPriceDesc(100000);
List<Entity>
형태로 반환JPQL문이나 SQL문으로 query를 생성하는 방식
package com.shop.repository;
import com.shop.entity.Item;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
public interface ItemRepository extends JpaRepository<Item, Long> {
// JPQL 문으로 query 생성
@Query("select i from Item i where i.itemDetail like %:itemDetail% order by i.price desc")
List<Item> findByItemDetail(@Param("itemDetail") String itemDetail);
// MySQL 문으로 query 생성
@Query(value = "select * from item i where i.item_detail like %:itemDetail% order by i.price desc", nativeQuery = true)
List<Item> findByItemDetailByNative(@Param("itemDetail") String itemDetail);
}
Query method의 경우, 조건이 많아지면 메서드의 이름이 길어져서 파악하기 어려움
@Query
annotation으로 복잡한 조건문을 JPQL문으로 표현 가능
@Param
annotation에 지정된 이름으로 파라미터를 받고, JPQL문의 %: %
사이에 변수로 지정 가능
nativeQuery = true
설정 시 기존 SQL을 그대로 사용할 수 있지만, 데이터베이스에 독립적이지 못함
@Autowired
ItemRepository itemRepository;
List<Item> itemList1 = itemRepository.findByItemDetail("description");
List<Item> itemList2 = itemRepository.findByItemDetailByNative("description");
List<Entity>
형태로 반환