티스토리 뷰

Spring

Springboot - JPA 이름 규칙

따강아지 2023. 8. 24. 12:56

JPA로 개발시 쿼리 자동 생성에 따른 Repository Method 명명 규칙 입니다.

1. repositories 요소

이름 설명
base-package Repository 자동 검색할 패키지로 설정한패키지 아래의 모든 패키지도 검사되며,  와일드카드가 허용됩니다.
repository-impl-postfix 사용자 정의 Repository 구현체의 접미사. 
기본값은 Impl.
query-lookup-strategy 쿼리를 생성하는 데 사용할 전략으로  " 쿼리 조회 전략 "에서 확인 할 수 있습니다.
기본값은 create-if-not-found.
named-queries-location 외부에서 정의된 쿼리가 포함된 속성 파일을 검색할 위치 .
consider-nested-repositories 중첩된 저장소 인터페이스 정의를 고려해야 하는지 여부. 기본값은 false

2. 메서드 명명 Keyword

명명 규칙 설명
find…By, 
read…By, 
get…By, 
query…By, 
search…By,
stream…By
조회시 사용 되는 메서드 명명 규칙으로 , Collection, Streamable하위 유형,  Page,  GeoResults 타입으로 결과를 반환 하는 메서드 입니다.
findBy…로 사용 하거나 findMyDomainTypeBy…추가 키워드와 조합하여 사용할 수 있습니다 .
exists…By 존재 유무를 조회 하는 쿼리에 대한 메서드 명명 규칙이며  boolean결과를 반환합니다.
count…By 쿼리에서 count와 같은 역활을 하늠 메서드 명명 규칙
delete…By,
remove…By
 void 또는 삭제 횟수를 반환하는 삭제 쿼리 메서드 명명 규칙
…First<number>…,
…Top<number>…
Top 쿼리와 같은 의미를 가지는 메서드 명명 규칙으로 number에 지정한 수 만큼 제한 할 때 사용 됩니다. 
…Distinct… 쿼리의 Discinct와 같은 기능을 하는 메서드의 명명 규칙

3, 쿼리에 사용 되는 조건식 명명 규칙

키워드 표현식
AND And
OR Or
AFTER After,IsAfter
BEFORE Before,IsBefore
CONTAINING Containing, IsContaining,Contains
BETWEEN Between,IsBetween
ENDING_WITH EndingWith, IsEndingWith,EndsWith
EXISTS Exists
FALSE False,IsFalse
GREATER_THAN GreaterThan,IsGreaterThan
GREATER_THAN_EQUALS GreaterThanEqual,IsGreaterThanEqual
IN In,IsIn
IS Is, Equals, (또는 키워드 없음)
IS_EMPTY IsEmpty,Empty
IS_NOT_EMPTY IsNotEmpty,NotEmpty
IS_NOT_NULL NotNull,IsNotNull
IS_NULL Null,IsNull
LESS_THAN LessThan,IsLessThan
LESS_THAN_EQUAL LessThanEqual,IsLessThanEqual
LIKE Like,IsLike
NEAR Near,IsNear
NOT Not,IsNot
NOT_IN NotIn,IsNotIn
NOT_LIKE NotLike,IsNotLike
REGEX Regex, MatchesRegex,Matches
STARTING_WITH StartingWith, IsStartingWith,StartsWith
TRUE True,IsTrue
WITHIN Within,IsWithin

예제

키워드 Sample JPQL snippet
And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2
Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2
Is
Equals
findByFirstname
findByFirstnameIs
findByFirstnameEquals
… where x.firstname = ?1
Between findByStartDateBetween … where x.startDate between ?1 and ?2
LessThan findByAgeLessThan … where x.age < ?1
LessThanEqual findByAgeLessThanEqual … where x.age <= ?1
GreaterThan findByAgeGreaterThan … where x.age > ?1
GreaterThanEqual findByAgeGreaterThanEqual … where x.age >= ?1
After findByStartDateAfter … where x.startDate > ?1
Before findByStartDateBefore … where x.startDate < ?1
IsNull findByAgeIsNull … where x.age is null
IsNotNull,NotNull findByAge(Is)NotNull … where x.age not null
Like findByFirstnameLike … where x.firstname like ?1
NotLike findByFirstnameNotLike … where x.firstname not like ?1
StartingWith findByFirstnameStartingWith … where x.firstname like ?1(parameter bound with appended %)
EndingWith findByFirstnameEndingWith … where x.firstname like ?1(parameter bound with prepended %)
Containing findByFirstnameContaining … where x.firstname like ?1(parameter bound wrapped in %)
OrderBy findByAgeOrderByLastnameDesc … where x.age = ?1 order by x.lastname desc
Not findByLastnameNot … where x.lastname <> ?1
In findByAgeIn(Collection<Age> ages) … where x.age in ?1
NotIn findByAgeNotIn(Collection<Age> ages) … where x.age not in ?1
True findByActiveTrue() … where x.active = true
False findByActiveFalse() … where x.active = false
IgnoreCase findByFirstnameIgnoreCase … where UPPER(x.firstame) = UPPER(?1)

4. 조건식의 수정 키워드

키워드 설명
IgnoreCase,IgnoringCase 대소문자 구별 없이 조회 
AllIgnoreCase,AllIgnoringCase 대소문자를 무시 
OrderBy… 정렬 순서 (예: OrderByFirstnameAscLastnameDesc).

5. 예제

public interface CrudRepository<T, ID> extends Repository<T, ID> {

  <S extends T> S save(S entity);    	// 저장  

  Optional<T> findById(ID primaryKey);  // 조회

  Iterable<T> findAll();  				// 전체 조회             

  long count();							// count                        

  void delete(T entity);     			// 삭제          

  boolean existsById(ID primaryKey);    // 존재 여부

  // … more functionality omitted.
}
 
페이징 
Page<User> findByLastname(String lastname, Pageable pageable);

Slice<User> findByLastname(String lastname, Pageable pageable);

Window<User> findTop10ByLastname(String lastname, ScrollPosition position, Sort sort);

List<User> findByLastname(String lastname, Sort sort);

List<User> findByLastname(String lastname, Pageable pageable);

 

참고 : https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repository-query-keywords

 

Spring Data JPA - Reference Documentation

Example 121. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del

docs.spring.io

 

'Spring' 카테고리의 다른 글

Springboot 예약된 작업 실행  (0) 2023.08.25
Query-DSL 참고 문서  (0) 2023.08.24
Springboot JPA Pagination  (0) 2023.08.23
SpringBoot 로그 출력  (0) 2023.08.15
SpringBoot - ES 개발  (0) 2023.08.15