Java/Spring Boot

[Spring Boot] JpaRepository의 쿼리 메서드 자동 구현

크리스피코드 2023. 4. 11. 00:03

비교적 단순한 쿼리들은 JpaRepository에서 @Query를 사용하지 않아도 구현할 수 있다. 예를들어 두 개의 값을 조건으로 결과를 조회하는 쿼리이다.

 

SELECT * 
  FROM comment
 WHERE comment_sn = [값 1]
   AND board_sn = [값 2];

 

이를 JpaRepository에서 메서드의 이름을 규칙에 맞게 설정하는 것으로 작성할 수 있다. JpaRepository에는 findById()라는 메서드가 있다. 이 메서드는 Id 하나를 사용해 쿼리를 조회하는 기능을 한다.

 

이 메서드의 이름을 약간 바꾸면 @Query를 사용하지 않고도 조건 2개를 사용하는 쿼리를 만들 수 있다.

 

Optional<Comment> findByBoardSnAndCommentSn(Long boardSn, Long commentSn);

 

findBy ~를 이어서 BoardSnAndCommentSn이 붙었다. 여기에 'And'는 실제 쿼리에 사용되는 'AND' 구문을 의미한다. 즉, boardSn과 commentSn라는 2개의 컬럼을 사용해 SELECT문을 수행하는 메서드이다.

 

덧붙여 메서드의 파라미터 순서는 매우 중요하다. findByNameAndAge일 경우 파라미터의 순서는 첫 번째가 name, 두 번째가 age이어야한다. 파라미터명은 일치하지 않아도 상관없다.

 

 

* 쿼리메서드 작명

And findByNameAndAge(String name, int age)
= WHERE name = #{name} AND age = #{age}
Or findByNameOrAge(String name, int age)
= WHERE name = #{name} OR age = #{age}
Between findByAgeBetween(int num1, int num2)
= WHERE age BETWEEN #{num1} AND #{num2}
LessThan findByAgeLessThan(int age)
= WHERE age < #{age}
LessThanEqual findByAgeLessThanEqual(int age)
= WHERE age <= #{age}
GreaterThan findByAgeGreaterThan(int age)
= WHERE age > #{age}
GreaterThanEqual findByAgeGreaterThanEqual(int age)
= WHERE age >= #{age}
After findByDateAfter(Date date)
= WHERE date > #{date}
Before findByDateBefore(Date date)
= WHERE date < #{date}
IsNull findByNameIsNull()
= WHERE name IS NULL
IsNotNull, NotNull findByNameIsNotNull()
= WHERE name IS NOT NULL
Like findByNameLike(String name)
= WHERE name LIKE #{name}
NotLike findByNameNotLike(String name)
= WHERE name NOT LIKE #{name}
StartsWith, StartingWith findByNameStartsWith(String name)
= WHERE name LIKE #{name} || '%'
EndsWith, EndingWith findByNameEndsWith(String name)
= WHERE name LIKE '%' || #{name}
Contains, Containing findByNameContains(String name)
= WHERE name LIKE '%' || #{name} || '%'
OrderBy findByAgeOrderByName(int age)
= WHERE age = #{age} ORDER BY name
Not findByNameNot(String name)
= WHERE name != #{name}
In findByNameIn(Collection<String> names)
= WHERE name IN #{names}
NotIn findByNameNotIn(Cllection<String> names)
= WHERE name NOT IN #{names}
True findByBoolTrue()
= WHERE bool = true
False findByBoolFalse()
= WHERE bool = false