취미로 음악을 하는 개발자

[Spring Framework] 쿼리 메소드 (2) 본문

공대인/Spring[Boot]

[Spring Framework] 쿼리 메소드 (2)

영월특별시 2019. 10. 5. 23:59
728x90
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package org.zerock.persistence;
 
import java.util.Collection;
import java.util.List;
 
import org.springframework.data.repository.CrudRepository;
import org.zerock.domain.Board;
 
public interface BoardRepository extends CrudRepository<Board, Long>{
    public List<Board> findBoardByTitle(String title);
    public Collection<Board> findByWriter(String writer);
    
    // 작성자에 대한 Like % 키워드 %
    public Collection<Board> findByWriterContaining(String writer);
    // Or 조건의 처리
    public Collection<Board> findByTitleContainingOrContentContaining(
            String title, String content);
    // Title Like % ? % and Bno > ?
    public Collection<Board> findByTitleContainingAndBnoGreaterThan(
            String keyword, Long num);
    // Bno > ? Order by bno Desc
    public Collection<Board> findByBnoGreaterThanOrderByBnoDesc(Long bno);
}
cs


findBy를 이용한 특정 컬럼 처리


SQL문에서 특정한 컬럼의 값을 조회할 때는 쿼리 메소드의 이름을 findBy로 시작하는 방식을 이용한다.

Collection<T> findBy + 속성 이름(속성 타입)

public Collection<Board> findByWriter(String writer);


findBy.. 로 시작하는 쿼리 메소드는 지정하는 속성의 값에 따라 파라미터의 타입이 결정된다. Board 클래스에서 writer 속성의 값이 문자열이기 때문에 파라미터 타입은 String으로 지정한다. findBy.. 로 시작하는 쿼리 메소드의 리턴 타입은 Collection으로 설계하면 되기 때문에 forEach 구문을 이용해서 데이터를 출력하면 다음과 같은 형태가 된다.


1
2
3
4
5
    @Test
    public void testByWriter() {
        Collection<Board> results = repo.findByWriter("user00");
        results.forEach(board -> System.out.println(board));
    }
cs



Board 클래스가 가리키는 테이블에서 작성자 이름이 "user00"인 컬럼들을 조회한 것이다.



like 구문 처리


findBy와 더불어 가장 많이 사용하는 구문으로, like에 대한 처리는 아래와 같은 형태로 사용한다.


 형태

쿼리 메소드

 단순 like 

 Like 

 키워드 + '%' 

 StartingWith 

 '%' + 키워드 

 EndingWith

 '%' + 키워드 + '%' 

 Containing 


    // 작성자에 대한 Like % 키워드 %
    public Collection<Board> findByWriterContaining(String writer);


1
2
3
4
5
6
    @Test
    public void testByWriterContaining() {
        Collection<Board> results = repo.findByWriterContaining("05");
        // for 루프 대신 forEach
        results.forEach(board -> System.out.println(board));
    }
cs


Board 클래스가 가리키는 테이블에서 작성자 이름에 "05"가 들어있는 컬럼을 조회한 것이다.

아래는 Hibernate 출력에서 like가 사용된 것을 알 수 있는 부분과 조회된 컬럼 리스트이다.




and 혹은 or 조건 처리


경우에 따라 2개 이상의 속성을 이용해서 엔티티들을 검색해야 할 때가 있다. 이 경우를 위해 쿼리 메소드에는 'And'와 'Or'를 사용한다. 다만, 속성이 두 개 이상일 때는 파라미터 역시 지정한 속성의 수만큼 맞춰줘야 한다.


    // Or 조건의 처리
    public Collection<Board> findByTitleContainingOrContentContaining(
            String title, String content);


title과 content 속성에 특정한 문자열로 조회하는 코드로, findBy + TitleContaining + Or + ContentContaining 과 같은 형태가 된다. title과 content에 대한 코드이므로 파라미터 역시 두 개인 것을 알 수 있다.



부등호 처리


쿼리 메소드에서는 '<'와 '>' 같은 부등호는 'GreaterThan', 'LessThan'을 이용해서 처리할 수 있다.

title에 특정한 문자가 포함되어 있고 bno가 특정 숫자 이상인 데이터를 조회하고 싶을 때, 아래와 같은 형태가 된다.


    // Title Like % ? % and Bno > ?
    public Collection<Board> findByTitleContainingAndBnoGreaterThan(
            String keyword, Long num);


1
2
3
4
5
    @Test
    public void testByTitleAndBno() {
        Collection<Board> results = repo.findByTitleContainingAndBnoGreaterThan("5", 50L);
        results.forEach(board -> System.out.println(board));
    }
cs


위의 코드는 title에 5가 포함되고 번호가 50보다 큰 데이터를 조회하는 것이다.




Order by 처리


가져오는 데이터의 순서를 지정하기 위해서는 OrderBy + 속성 + Asc or Desc 를 이용한다.

bno가 특정 번호보다 큰 컬럼을 bno 값의 역순으로 처리하고 싶다면 아래와 같다.


    // Bno > ? Order by bno Desc
    public Collection<Board> findByBnoGreaterThanOrderByBnoDesc(Long bno);


1
2
3
4
5
    @Test
    public void testBnoOrderBy() {
        Collection<Board> results = repo.findByBnoGreaterThanOrderByBnoDesc(90L);
        results.forEach(board -> System.out.println(board));
    }
cs


bno가 90보다 큰 컬럼을 내림차순으로 조회한다.




Comments