728x90
반응형
쿼리 메서드?
말 그대로 '메서드의 이름 자체가 쿼리문'이 되는 기능이다.
쿼리 메서드는 주로 'findBy 나 getBy..'로 시작하고 이 후 And, Or와 같은 키워드를 이용한다.
사용하는 키워드에 따라서 파라미터의 개수가 결정된다.
예를 들어, Spring Data JPA 문서를 보면
findByStartDateBetween은 ...where x.startDate between ?1 and ?2
라고 설명되어 있듯 해당 키워드는 2개의 변수가 필요하다는걸 알 수 있다.
리턴 타입도 select를 하는 작업은 List나 배열을 이용 할 수 있고,
파라미터에 Pageable이 들어간는 경우엔 무조건 Page<E>로 이용해야 한다.
테스트 코드를 통해 알아보자.
Repository 인터페이스에 추가
public interface MemoRepository extends JpaRepository<Memo, Long> {
List<Memo> findByMnoBetweenOrderByMnoDesc(Long from, Long to);
}
|
cs |
등록한 메소드 이용
public void testQueryMethods() {
List<Memo> list =
memoRepository.findByMnoBetweenOrderByMnoDesc(70L, 80L); for(Memo memo : list) {
System.out.println(memo);
}
}
|
cs |
테스트 결과
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
Hibernate:
select
memo0_.mno as mno1_0_,
memo0_.memo_text as memo_tex2_0_
from
tbl_memo memo0_
where
memo0_.mno between ? and ?
order by
memo0_.mno desc
Memo(mno=80, memoText=Sample...80)
Memo(mno=79, memoText=Sample...79)
Memo(mno=78, memoText=Sample...78)
Memo(mno=77, memoText=Sample...77)
Memo(mno=76, memoText=Sample...76)
Memo(mno=75, memoText=Sample...75)
Memo(mno=74, memoText=Sample...74)
Memo(mno=73, memoText=Sample...73)
Memo(mno=72, memoText=Sample...72)
Memo(mno=71, memoText=Sample...71)
Memo(mno=70, memoText=Sample...70)
|
cs |
쿼리 메서드와 Pageable
앞서 말했든 쿼리 메서드는 Pageable 파라미터를 같이 결합해서 사용 할 수 있어서 정렬에 관한 부분은 더 간략하게 사용 할 수 있다. 테스트 코드를 통해 알아보자.
Repository 인터페이스에 추가
1
2
3
|
public interface MemoRepository extends JpaRepository<Memo, Long> {
List<Memo> findByMnoBetweenOrderByMnoDesc(Long from, Long to); Page<Memo> findByMnoBetween(Long from, Long to, Pageable pageable);
} |
cs |
등록한 메서드 이용
1
2
3
4
5
6
7
|
public void testQueryMethodWithhPagable() {
Pageable pageable = PageRequest.of(0, 10, Sort.by("mno").descending());
Page<Memo> result = memoRepository.findByMnoBetween(10L, 50L, pageable);
result.get().forEach(memo -> System.out.println(memo));
}
|
cs |
테스트 결과
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
Hibernate:
select
memo0_.mno as mno1_0_,
memo0_.memo_text as memo_tex2_0_
from
tbl_memo memo0_
where
memo0_.mno between ? and ?
order by
memo0_.mno desc limit ?
Hibernate:
select
count(memo0_.mno) as col_0_0_
from
tbl_memo memo0_
where
memo0_.mno between ? and ?
Memo(mno=50, memoText=Sample...50)
Memo(mno=49, memoText=Sample...49)
Memo(mno=48, memoText=Sample...48)
Memo(mno=47, memoText=Sample...47)
Memo(mno=46, memoText=Sample...46)
Memo(mno=45, memoText=Sample...45)
Memo(mno=44, memoText=Sample...44)
Memo(mno=43, memoText=Sample...43)
Memo(mno=42, memoText=Sample...42)
Memo(mno=41, memoText=Sample...41)
|
cs |
deleteBy
deleteBy로 메서드의 이름을 시작하면 특정 조건에 맞는 데이터를 삭제하는 것도 가능하다.
deleteBy는 실제 개발에는 많이 사용되지는 않는데 그 이유는 SQL을 이용하듯 한 번에 삭제가 되는 것이 아니라
하나 하나씩 삭제하기 때문에 개발시에는 @Query 어노테이션을 많이 사용한다.
우선 테스트 코드를 통해 알아보자.
Repository 인터페이스에 추가
1
2
3
|
public interface MemoRepository extends JpaRepository<Memo, Long> {
void deleteMemoByMnoLessThan(Long num);
}
|
cs |
등록한 메서드 이용
1
2
3
4
5
|
@Commit
@Transactional
public void testDeleteQueryMethods() {
memoRepository.deleteMemoByMnoLessThan(10L);
}
|
cs |
테스트 결과
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
Hibernate:
delete
from
tbl_memo
where
mno=?
Hibernate:
delete
from
tbl_memo
where
mno=?
Hibernate:
delete
from
tbl_memo
where
mno=?
|
cs |
위와 같이 결과를 보면 하나하나 삭제되는 것을 확인할 수 있다.
오늘은 쿼리 메서드에 대해 알아보았고 다음엔 @Query 어노테이션을 작성해보도록 하겠다.
728x90
반응형
'스프링' 카테고리의 다른 글
[Spring Boot] Thymeleaf를 활용해보자(1) (0) | 2023.01.12 |
---|---|
[Spring] @Query 어노테이션에 대해 알아보자 (0) | 2023.01.09 |
[Spring] Pageable 인터페이스 사용해보기 (0) | 2023.01.08 |
[Spring] JpaRepository 사용법 (0) | 2023.01.08 |
엔티티 클래스(Entity Class) (0) | 2023.01.08 |