https://velog.io/@khyme1022/Spring-Boot-7-Spring-Data-JPA
https://velog.io/@khyme1022/Spring-Boot-8-Spring-Data-JPA
ProductRepository
public interface ProductRepository extends JpaRepository<Product,Long> { // JpaRepository 메소드 제공
//find...By
// 조회 쿼리 수행 후 결과 리턴
Optional<Product> findByNumber(Long number);
List<Product> findAllByName(String name);
Product queryByNumber(Long Number);
//exists...By
// 특정 데이터 존재 확인 결과로 참 거짓 리턴
boolean existsByNumber(Long number);
//count...By
// 조회 쿼리 수행 및 결과 개수 리턴
long countByName(String Name);
//delete...By, remove...By
// 삭제 쿼리 수행 및 삭제 횟수 리턴 / 리턴 없음
void deleteByNumber(Long number);
long removeByName(String name);
//...First<number>..., ...Top<number>...
// 조회 쿼리 수행 후 결과값 개수 제한
List<Product> findFirst5ByName(String name);
List<Product> findTop10ByName(String name);
/*
여기서부턴 조건자 키워드 다룰 거임
*/
// Is
// findByNumber 메소드와 동일하게 동작
Product queryByNumberIs(Long Number);
// (Is)Not
// 값 불일치를 조건으로 사용하는 키워드 Number가 아닌 것 조회
Product findByNumberIsNot(Long Number);
// (Is)Null, (Is)NotNull
// 값이 null인지 검사하는 조건자 키워드
List<Product> findByUpdateAtNull();
List<Product> findByUpdateAtNotNull();
// (Is)True, (Is)False
// Boolean 칼럼 값 확인하는 키워드
// Product findByisActiveTrue();
// 위 코드는 에러 남
// And, Or
// 복수 조건 키워드
Product findByNumberAndName(Long Number, String name);
// (Is)GreaterThen, (Is)LessThan, (Is)Between
// 숫자, datetime 칼럼 대상 비교 연산에 사용
List<Product> findByPriceIsGreaterThan(Long price);
List<Product> findByPriceBetween(Long lowPrice,Long HighPrice);
//(Is)StartingWith, (Is)EndingWith, (Is)Containing, (Is)Like
// 일부 일치 여부 확인하는 조건자 키워드 `%`와 동일한 역할
/*
List<Product> findByNameLike(String name);
List<Product> findByEndingWith(String name);
*/
/*
여기서부턴 정렬 및 페이징 처리
*/
// OrderBy 구문 사용
// 여러 조건으로 정렬할 시 키워드를 따로 사용하지 않고 그대로 붙혀서 작성
List<Product> findByNameOrderByNumberAsc(String name);
List<Product> findByNameOrderByNumberAscStockDesc(String name);
List<Product> findByName(String name, Sort sort); // 매개변수를 통한 정렬
@Query(value = "SELECT p FROM AS Product p WHERE p.name = :name", nativeQuery = true)
List<Product> findByName(@Param("name") String name);
}
사용 예
@SpringBootTest
public class ProductRepositoryTest {
@Autowired
ProductRepository productRepository;
@Test
void sortingAndPagingTest(){
Product product1 = new Product();
product1.setName("펜");
product1.setPrice(1000);
product1.setStock(100);
product1.setCreateAt(LocalDateTime.now());
product1.setUpdateAt(LocalDateTime.now());
Product product2 = new Product();
product2.setName("펜");
product2.setPrice(5000);
product2.setStock(300);
product2.setCreateAt(LocalDateTime.now());
product2.setUpdateAt(LocalDateTime.now());
Product savedProduct1 = productRepository.save(product1);
Product savedProduct2 = productRepository.save(product2);
/** 어떤 기준으로 정렬할 지 넣어준다.
productRepository.findByName("펜", Sort.by(Order.asc("price")));
productRepository.findByName("펜", Sort.by(Order.asc("price"),Order.desc("stock")));
}
}
ProductRepository
Page<Product> findByName(String name, Pageable pageable);
사용 예
Page<Product> productPage = productRepository.findByName("펜", PageRequest.of(0,2));
사용 시에는 PageRequest 클래스의 of 메서드를 통해 Pageable 파라미터를 전달 받는다.
ProductRepository
@Query(value = "SELECT p FROM AS Product p WHERE p.name = :name", nativeQuery = true)
List<Product> findByName(@Param("name") String name);
/** 특정 칼럼의 값만 추출하는 것도 가능하다. */
@Query(value = "SELECT p.name, p.price FROM AS Product p WHERE p.name = :name", nativeQuery = true)
List<Product> findByName2(@Param("name") String name);