티스토리 뷰
쿼리 메서드는 말 그대로 메서드의 이름 자체가 하나의 쿼리문이 되는 기능이다.
해당 쿼리 메서드의 메서드 명을 지정할 때는 findBy, getBy 등으로 메서드의 이름을 시작하고 칼럼과 키워드를 연결하는 것으로 메서드를 작성한다.
메서드 이름에 대한 Reference는 다음 링크에서 확인할 수 있다.
Keyword-Reference: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation
구현은 다음과 같이 Repository 인터페이스에 해당 메서드를 추상 메서드 형태로 선언하고, 바로 사용하면 끝이다.
◎Repository.java(interface)
package com.example.demo.repository;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import com.example.demo.entity.Memo;
public interface MemoRepository extends JpaRepository<Memo, Long> {
//Memo의 mno 값이 70 ~ 80 사이의 객체들을 조회하고, mno의 역순으로 정렬할 수 있는 쿼리 메서드
List<Memo> findByMnoBetweenOrderByMnoDesc(Long from, Long to);
}
◎test.java
package com.example.demo.repository;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.example.demo.entity.Memo;
@SpringBootTest
public class MemoRepositoryTest {
@Autowired
MemoRepository memoRepository;
@Test
public void testQueryMethods() {
List<Memo> list = memoRepository.findByMnoBetweenOrderByMnoDesc(70L, 80L);
for(Memo memo : list) {
System.out.println(memo);
}
}
}
그럼 다음과 같이 결과를 확인할 수 있다.
마찬가지로 delete 쿼리도 작성하여 조건에 맞는 객체를 삭제할 수 있지만, deleteBy 메서드를 사용할 때는 반드시
@Commit: 자동 Rollback 방지
@Transactional: 예외 발생 방지(javax.persistence.TransactionRequiredException)
어노테이션을 사용해야 한다.
◎Repository.java(interface)
package com.example.demo.repository;
import java.util.List;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import com.example.demo.entity.Memo;
public interface MemoRepository extends JpaRepository<Memo, Long> {
// 특정 조건에 맞는 엔티티 객체를 삭제하는 쿼리 메서드
void deleteMemoByMnoLessThan(Long num);
}
◎test.java
package com.example.demo.repository;
import java.util.List;
import javax.transaction.Transactional;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Commit;
@SpringBootTest
public class MemoRepositoryTest {
@Autowired
MemoRepository memoRepository;
// Memo의 mno가 10 보다 작은 엔티티 객체를 삭제하는 메서드
@Test
@Commit
@Transactional
public void testDeleteQueryMethods() {
memoRepository.deleteMemoByMnoLessThan(20L);
}
}
또한, 쿼리 메서드와 Pageable 객체를 결합하여 사용할 수도 있다.
Pageable 에 대한 자세한 설명은 타 블로그에 잘 정리된 내용이 있다.
Pageable: https://jiyongpark-dev.tistory.com/15
◎Repository.java(interface)
package com.example.demo.repository;
import java.util.List;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import com.example.demo.entity.Memo;
public interface MemoRepository extends JpaRepository<Memo, Long> {
//Memo의 mno 값이 70 ~ 80 사이의 객체들을 조회하고, mno의 역순으로 정렬할 수 있는 쿼리 메서드
List<Memo> findByMnoBetweenOrderByMnoDesc(Long from, Long to);
//쿼리 메서드와 Pageable을 결합하는 쿼리 메서드
Page<Memo> findByMnoBetween(Long from, Long to, Pageable pageable);
}
◎test.java
package com.example.demo.repository;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import com.example.demo.entity.Memo;
@SpringBootTest
public class MemoRepositoryTest {
@Autowired
MemoRepository memoRepository;
@Test
public void testQueryMethods() {
List<Memo> list = memoRepository.findByMnoBetweenOrderByMnoDesc(70L, 80L);
for(Memo memo : list) {
System.out.println(memo);
}
}
// 쿼리 메서드와 Pageable 결합
// Memo의 mno 값이 10 ~ 50 사이의 객체를 조회하고,
// 그 중에 첫 페이지에 해당하는 10개의 객체를 mno 를 기준으로 역순 정렬
@Test
public void testQueryMethodWithPageable() {
Pageable pageable = PageRequest.of(0, 10, Sort.by("mno"));
Page<Memo> result = memoRepository.findByMnoBetween(10L, 50L, pageable);
result.get().forEach(memo -> System.out.println(memo));
}
}
'[JAVA] > Spring-Boot' 카테고리의 다른 글
[Spring-Boot] Thymeleaf 1: 시작하기 (0) | 2021.07.08 |
---|---|
[Spring-Boot] Spring Data JPA 3: @Query (0) | 2021.07.08 |
[Spring-Boot] Spring Data JPA 1: 시작하기 (0) | 2021.07.07 |
[Spring-Boot] Spring Data JPA 1차 정리(비공개) (0) | 2021.07.07 |
[Spring-Boot] Spring-Boot 프로젝트 Maria DB 사용 (0) | 2021.07.06 |
- await
- Promise
- 맛집
- 인천 구월동 이탈리안 맛집
- AsyncStorage
- 정보보안기사 #실기 #정리
- javascript
- 인천 구월동 맛집
- redux-thunk
- 이탈리안 레스토랑
- react-native
- Async
- 파니노구스토
- redux
- react
- Total
- Today
- Yesterday