Spring Data JPA 로 쿼리를 생성하는 방법들을 공부해 보겠습니다.
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);
}
@Entity
public class Item{
@Id
@Column(name="item_id")
private Long id; // 상품코드
private String itemNm; //상품명
private int price; //가격
private int stock; //재고수량
private String itemDetail; // 상품 설명
@Enumerated(EnumType.STRING)
private ItemSellStatus itemSellStatus; // 상품 판매상태
private LocalDateTime regTime; //등록일시
private LocalDateTime modTime; // 수정 일시
}
List<Item> itemList = itemRepository.findByItemNm("xxx");
// 상품명이 xxx 인 것을 조회합니다.
List<Item> itemList = itemRepository.findByItemNmOrItemDetail("xxx","yyy");
// 상품명이 xxx 또는 상품 상세가 yyy 인 것을 조회합니다.
// 꼭 같은 타입일 경우 인자 순서에 대하여 조심해야합니다.
List<Item> itemList = itemRepository.findByPriceLessThanOrderByPriceDesc(10000);
//가격이 1000원보다 작은 상품들을 내림차순 정렬시켜줍니다.
@NamedQuery(
name ="Item.findByStock",
query = "select i from Item i where i.stock <= :stock"
)
// 재고 수량이 100개 이하인 것을 검색하기 위한 Item Class에 @NamedQuery 선언
public class Item{
...
}
// 사용할 때는 ItemRepository에 메서드를 추가해서 사용하면 됩니다.
List<Item> findByStock(@Param("stock") Integer stock);
List<Item> itemList = itemRepository.findByStockNumber(100);
앞에서는 1,2 개 정도의 조건을 이용하여 쿼리 메서드를 사용하였습니다.
하지만 조건이 많아질 때 쿼리 메서드를 사용하면 이름이 많이 복잡하고 길어지기 때문에 이를 보완하기 위해 @Query
어노테이션 방법을 사용합니다.
Spring Data JPA 에서 제공하는 @Query
어노테이션을 이용하면 SQL과 유사한 JPQL(엔티티 객체를 대상으로 쿼리를 수행) 객체지향 쿼리언어를 통해 복잡한 쿼리도 처리가 가능해집니다
@Query("select i from Item i where i.itemDetail like %:itemDetail% order by i.price desc")
List<Item> findByItemDetail(@Param String itemDetail);
List<Item> itemList = itemRepository.findByItemDetail("xxx");
// 상품 설명에 xxx가 포함되어 있는 아이템 리스트를 내림차순으로 검색하는 쿼리문