find,read,get,query,search,stream은 조회
-> < T > 타입을 반환
First1, Top1 같은 것은 조건 중 상위 한개값 리턴
-> 2로 할시 상위 2개, limit query 추가되는 것을 볼 수 있음
List<User> findFirst2ByName(String name);
List<User> findTop2ByName(String name);
Last1으로 하였을 땐 findByName과 같게 동작
-> 인식되지 않는 키워드는 무시
After
,Before
는 보통 날짜, 시간 비교에 사용
-> userRepository.findByAfter(4L)처럼 숫자 비교에도 사용 가능
Greater than, GreaterThenEquals 는 숫자 및 날짜 시간 비교에 사용
Between
List<User> findByCreatedAtBetween(LocalDateTime yesterday, LocalDateTime tomorrow);
List<User> findByIdBetween(Long id1, Long id2);
Between은 양 끝에 값을 포함 시킴
-> Before,After은 포함 X
-> FindByIdGreaterThanEqualsAndLessThanEqual
과 같은 의미
쿼리의 오류는 잡아 주지 못하니까 쿼리를 로그로 출력하여 확인잘하자!
Empty는 Collection 타입의 not Empty
In,NotIn
List<User> findByNameIn(List<String> names);
// 보통은 배열을 만들어 넣기보다는 다른 쿼리에 결과를 잡아넣음
// 어느 사이즈의 결과가 들어갈지 검증하는 것도 중요
System.out.println("findByNameIn: " + userRepository.findByNameIn(Lists.newArrayList("martin", "dennis")));
StartingWith
, EndingWith
는 보통 문자열에 사용
List<User> findByNameStartingWith(String name);
List<User> findByNameEndingWith(String name);
List<User> findByNameContains(String name);
List<User> findByNameLike(String name);
contains 는 양방향 Like -> %art%
StartingWith -> mar%
EndingWith -> %tin
List<User> findTop1ByNameOrderByIdDesc(String name);
아이디 역순 중 첫번째 값
오름차순은 : Asc
List<User> findFirstByNameOrderByIdDescEmailAsc(String name);
Sort 이용
List<User> findFirstByName(String name, Sort sort);
System.out.println("findFirstByNameWithSortParams: "
+ userRepository.findFirstByName("martin", Sort.by(Sort.Order.desc("id"),
Sort.Order.asc("email"))));
@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
Iterable<T> findAll(Sort sort);
Page<T> findAll(Pageable pageable);
}
Page<User> findByName(String name, Pageable pageable);
System.out.println("findByNameWithPaging" +
userRepository.findByName("martin",
PageRequest.of(0,1, Sort.by(Sort.Order.desc("id"))))
.getContent());