Springboot

[Spring Boot] JpaRepository에서의 쿼리메서드

Jenny376 2023. 3. 31. 00:04
안녕하세요. hia의 개발 story입니다.

 

Spring JPA의 경우 여러 가지의 검색 조건에 필요한 기능들을 제공합니다. 

  • 쿼리 메서드 : 메서드가 쿼리의 구문으로 처리되도록 하는 기능 
  • @Query : SQL처럼 만들기 위해 엔티티 클래스의 정보를 이용해 쿼리를 작성하는 기능
  • Querysl 등의 동적 쿼리 처리 기능 

 

오늘은 이 중에서 쿼리 메서드에 대해서 공부하려고 합니다.

 

쿼리 메서드

 

쿼리 메서드 문서는 아래 페이지에서 찾아볼 수 있습니다. 

처음부터 문서만 봐서는 활용하기 어려우니 기초적인 부분을 정리해보려고 합니다. 

 

Spring Data JPA - Reference Documentation

Example 119. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del

docs.spring.io

 

  • Between 예제

select 문에서 between where 조건을 걸기 위해서는

findBy기준 컬럼Between()함수를 Repository 인터페이스에 선언해 주면 됩니다.

Repository 클래스에 아래와 같이 함수를 선언해줍니다.

 

public interface SampleRepository extends JpaRepository<Sample, Long> {

    List<Sample> findByIdBetween(Long from, Long to);

}

그리고 아래와 같이 테스트 코드를 작성해서 만들어진 findByIdBetween 함수를 테스트합니다. 

@Test
public void testQueryMethod(){

    List<Sample> list = sampleRepository.findByIdBetween(15L, 25L);

    for(Sample sample : list){
        System.out.println(sample);
    }
}

 

그러면 아래와 같이 where 조건에 between 구문이 적용된 것을 볼 수 있습니다. 

 

  • Between + 정렬 하는 방법  

페이징은 두가지 방식으로 처리할 수 있습니다.

기존 Between 메소드에 OrderBy기준칼럼[Asc/Desc]을 붙이는 방법과 

저번에 배웠던 Pageable을 사용하는 방법이 있습니다.

두가지 방식에 맞게 Repository 인터페이스에 함수를 선언해 줍니다. 

// 쿼리메서드를 이용한 정렬 방법 
List<Sample> findByIdBetweenOrderById(Long from, Long to);

// Pageable을 이용한 정렬 방법
Page<Sample> findByIdBetween(Long from, Long to, Pageable pageable);

 함수들을 테스트 해보기 위해 테스트 코드를 작성해 봅니다. 

@Test
public void testQueryMethods(){

    List<Sample> list = sampleRepository.findByIdBetweenOrderById(5L,10L);

    list.forEach(sample -> System.out.println(sample));

    System.out.println("-------------------------------------------------------");

    Pageable pageable = PageRequest.of(0,10, Sort.by("id"));

    Page<Sample> samplePage = sampleRepository.findByIdBetween(5L,10L, pageable);

    samplePage.get().forEach(sample-> System.out.println(sample));

}

 

OrderBy 함수를 이용하면 아래와 같이 OrderBy 기준컬럼 asc로 정렬이 됩니다. 

 

 

아래는 Pageable을 이용해 정렬을 했습니다.

함수가 길어지는게 싫다면 Pageable을 이용하는 것도 하나의 방법이 됩니다.