본문 바로가기

공부 정리/DB

Query Method

반응형

 Spring에서 사용하는 JpaRepository, CrudRepository 등에는 기본적인 CRUD 관련 메서드가 기본적으로 정의되어 있다. 예를 들어, 조회(검색)의 경우 findById()라는 메서드가 있는데, 내가 엔티티를 조회할 때 Id 뿐만 아니라 다른 것을 이용하고 싶다면 어떻게 할 수 있을까? 

 

 해당 메서드를 직접 정의하고 "구현"하지 않더라도, Spring Data JPA 규칙에 맞게 메서드 이름을 정의한다면 내부적으로 이름에 맞게 검색을 해준다.

 

다음은 Spring Data JPA 공식문서에서 제공하는 네이밍 방법이다.

https://docs.spring.io/spring-data/jpa/docs/1.5.0.RC1/reference/html/repository-query-keywords.html

 

public interface UserRepository extends JpaRepository<User, Long> {
    User findFirst1ByName(String name);
    List<User> findFirst2ByName(String name);
    User findTop1ByName(String name);
    List<User> findTop2ByName(String name);
    
    List<User> findLast2ByName(String name); //잘못된 문법!
}

 findLast2ByName(String name)처럼 잘못된 네이밍은 무시되고 findByName(String name)으로 작동한다. 따라서 사용하고 싶은 정렬 방법이 존재하는지 문서를 통해서 확인해야 한다.

 

public interface UserRepository extends JpaRepository<User, Long> {
    User findByCreatedAtAfter(LocalDateTime yesterday);
    User findByCreatedAtGreaterThan(LocalDateTime yesterday);
    
    User findByIdAfter(Long id);
    User findByIdGreaterThan(Long id);
}

 Before, After 등의 사용이 가능하다. 각각 LessThanGreaterThan에 대응한다. 해당 문법을 사용하는 경우, 가독성을 위해서 시간과 관련된 것을 사용하기를 권고한다.

 

public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findByActiveTrue();
    List<User> findByActiveFalse();
    
    List<User> findByNameIs(String name);
    List<User> findByNameEquals(String name);
    
    List<User> findByNameIsNull();
    List<User> findByNameIsNotNull();
}

 boolean형 필드는 True 혹은 False 검사로 조회할 수 있다.Active가 true이면 반환에 포함하고, false이면 포함하지 않을 것이다.

 

이외에, Is, Equals를 사용하면 조건문을 만들 수 있다.

 

isNull, isNotNull 은 매개변수 사용없이 null인지 아닌지를 판단해서 리스트를 리턴한다.

 

public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findByContainingJack(String name);
}

SQL 구문에서 like 를 사용하는 부분을 Containing을 사용하면 된다.

반응형

'공부 정리 > DB' 카테고리의 다른 글

객체지향 쿼리 언어  (0) 2021.09.17
Oracle DML GRANT, REVOKE 사용하기  (0) 2021.09.01
Spring Data Repository Interface  (0) 2021.08.29
SQL select 쿼리 문법 순서  (0) 2021.08.28
CDATA란?  (0) 2021.08.27