Spring Boot (11) Spring Data JPA 실습 2

넙데데맨·2022년 8월 18일
0
post-custom-banner

https://velog.io/@khyme1022/Spring-Boot-7-Spring-Data-JPA
https://velog.io/@khyme1022/Spring-Boot-8-Spring-Data-JPA

JPQL 및 쿼리 메소드

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 파라미터를 전달 받는다.

@Query 어노테이션 사용

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);
profile
차근차근
post-custom-banner

0개의 댓글