[JPA] Spring Data JPA(쿼리 메서드)

윤재열·2022년 10월 7일
0

Java

목록 보기
59/71

Spring Data JPA 로 쿼리를 생성하는 방법들을 공부해 보겠습니다.

메서드 이름으로 쿼리 생성

  • 쿼리메서드는 Repository 인터페이스에 간단한 네이밍 툴을 이용하여 메서드를 작성하면 원하는 쿼리를 실행할 수 있습니다.
  • 쿼리 메서드를 이용할 때 가장 많이 사용하는 문법으로 find를 사용해보겠습니다.
  • 엔티티의 이름은 생략이 가능합니다
    ex) findBy+변수이름
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);
}

Item Entity

@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 인 것을 조회합니다.
// 꼭 같은 타입일 경우 인자 순서에 대하여 조심해야합니다.
  • 가격이 10000원보다 작은 상품들 조회(가격은 내림차순)
List<Item> itemList = itemRepository.findByPriceLessThanOrderByPriceDesc(10000);
//가격이 1000원보다 작은 상품들을 내림차순 정렬시켜줍니다.

3. JPA에서 지원되는 키워드에 관한 공식문서

공식문서 링크


4. Named 쿼리

  • Spring Data JPA 선언한 도메인 클래스 + (점). + 메서드 이름으로 Named 쿼리를 찾아서 실행합니다.
  • 만약 실행할 Named쿼리가 없으면 메서드 이름으로 쿼리 생성전략을 사용합니다.
@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);

5. @Query 사용하기

  • 앞에서는 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가 포함되어 있는 아이템 리스트를 내림차순으로 검색하는 쿼리문
profile
블로그 이전합니다! https://jyyoun1022.tistory.com/

0개의 댓글