안녕하세요. 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을 이용하는 것도 하나의 방법이 됩니다.
'Springboot' 카테고리의 다른 글
[Spring Boot] @Query 어노테이션을 이용한 Spring JPA 예제 (0) | 2023.06.13 |
---|---|
[Spring Boot] 쿼리메서드 - deleteBy 사용하기 (0) | 2023.06.12 |
[Spring Boot] JpaRepository의 페이징 및 정렬 처리 하기 (0) | 2023.03.22 |
[Spring Boot] JpaRepository를 이용한 CRUD 테스트 예제 공부 (0) | 2023.03.21 |
[Spring Boot] Spring JPA 엔티티 클래스 작성해서 테이블 만들기 (0) | 2023.03.20 |