@Entity
public class Product extends Timestamped {
@GeneratedValue(strategy = GenerationType.AUTO)
@Id
private Long id;
private Long userId;
private String title;
private String image;
private String link;
private int lprice;
private int myprice;
}
public interface ProductRepository extends JpaRepository<Product, Long> {
}
// 1. 상품 생성
Product product = new Product(...);
productRepository.save(product);
// 2. 상품 전체 조회
List<Product> products = productRepository.findAll();
// 3. 상품 전체 개수 조회
long count = productRepository.count();
// 4. 상품 삭제
productRepository.delete(product);
public interface ProductRepository extends JpaRepository<Product, Long> {
// (1) 회원 ID 로 등록된 상품들 조회
List<Product> findAllByUserId(Long userId);
// (2) 상품명이 title 인 관심상품 1개 조회
Product findByTitle(String title);
// (3) 상품명에 word 가 포함된 모든 상품들 조회
List<Product> findAllByTitleContaining(String word);
// (4) 최저가가 fromPrice ~ toPrice 인 모든 상품들을 조회
List<Product> findAllByLpriceBetween(int fromPrice, int toPrice);
}
ID 외의 필드에 대한 추가 기능은 interface 만 선언해 주면, 구현은 Spring Data JPA 가 대신 해준다.
JPA 추가기능 구현 방법은 공식문서에 명시되어있음.
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods
인터페이스에 메소드만 선언하면 해당 메소드의 이름으로 적절한 JPQL 쿼리를 생성해서 실행
엔티티의 필드명이 변경되면 인터페이스에 정의한 메소드 이름도 꼭 함께 변경해주어야 한다.
Repository 메소드에 직접 쿼리를 정의
Native SQL을 사용할 경우
위치 기반 파라미터 바인딩
"select m from Member m where m.username = ?1"
이름 기반 파라미터 바인딩
"select m from Member m where m.username = :name"
@org.springframework.date.jpa.repository.Modifying
결과가 한 건 이상이면 컬렉션 인터페이스 사용
List findByName(String name);
단건이면 반환 타입을 지정
Member findByEmail(String email);
스프링 데이터 JPA는 쿼리 메소드에 페이징과 정렬 기능 제공
ㅇ 파라미터에 Pageable을 사용하면
// count 쿼리 사용
Page<Member> findByName(String name, Pageable Pageable);
// count 쿼리 사용 X
List<Mamber> findByName(String name, Pageable Pageable);
List<Mamber> findByName(String name, Sort sort);