[Spring Data] JPA - Query Methods

Seonghun Kim·2022년 8월 15일
1

Spring!

목록 보기
7/8
post-thumbnail

📌 Entity

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;  // 수정 시간

}
  • entity가 위와 같이 정의되어 있다고 가정

📌 Query method

메서드 이름으로 query를 생성하는 방식

✔ Repository

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 필드의 이름과 동일하게 하며, 첫 글자는 대문자로 변경하여 사용

  • Query method sample

✔ Test

@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> 형태로 반환

📌 @Query

JPQL문이나 SQL문으로 query를 생성하는 방식

✔ Repository

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을 그대로 사용할 수 있지만, 데이터베이스에 독립적이지 못함

  • JPQL sample

✔ Test

@Autowired
ItemRepository itemRepository;

List<Item> itemList1 = itemRepository.findByItemDetail("description");

List<Item> itemList2 = itemRepository.findByItemDetailByNative("description");
  • 조건에 알맞는 데이터들이 List<Entity> 형태로 반환

0개의 댓글