반응형
JPA에서 기본적으로 제공하는 메서드들이 있지만, where 절에 특정 값을 넣는 경우에는 기본제공 메서드들로 생성하기 한계가 있다
QueryMethod는 Repository에 메소드 이름으로 간편하게 where 절을 구성할 수 있게 해주는 기능이다 .
IDE에서 추천을 해주기 때문에 작성하는데에 더욱 편리하다
필드명까지 참조해서 추천해준다 하지만 아래의 추천이 모두 알맞은 쿼리를 작성해 주는 것은 아니기 때문에
아래의 규칙을 한번 보면 좋을 것 같다 . 리턴타입과 메서드명에 관한 규칙들이다
package com.ugo.jpatest.repository;
import com.ugo.jpatest.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User,Long>{
User findByName(String name);
List<User> findUsersByEmail(String email);
User findByNameAndEmail(String name,String email);
}
findByName 이라는 메서드를 만들었다 select * from user where name = ? 이런 형식의 쿼리가 나갈 것이다 .
테스트에서 한번 리턴 값을 찍어보자
Test
@Test
void queryMethodTest(){
userRepository.save(new User("고냥이","stau04@gmail.com"));
userRepository.save(new User("개냥이","stau04@gmail.com"));
//이름으로 유저를 찾는다.
User userByName = userRepository.findByName("고냥이");
//리턴을 리스트 형식으로 받는다.
List<User> usersByEmail = userRepository.findUsersByEmail("stau04@gmail.com");
//And도 추가 가능하다
User userByNameAndEmail= userRepository.findByNameAndEmail("고냥이","stau04@gmail.com");
//Top 3 를 가져온다 Last는 안되기 때문에 . OrderBy해서 Top을가져온다
List<User> userTop3 = userRepository.findTop3ByName("ugo");
System.out.println("userByName = " + userByName);
usersByEmail.forEach(user ->{
System.out.println("userByEmail : "+user);
});
System.out.println("userByNameAndEmail = " + userByNameAndEmail);
userTop3.forEach(user ->{
System.out.println("userTop3 : "+user);
});
}
console
위에 말한대로 추천해 주는대로 되는건 아니다 실수가 일어날 수 있기 때문에 테스트 코드를 작성하는 것이 좋다 . 규칙이 있고 만약 where 절에 들어 갈 것이 많아지면 메서드이름이 엄청 길어 질 것이다 .
모든 상황에 사용할 수는 없을 것 같다 . 하지만 간단한 상황에선 참 편한 것 같다.
반응형
'JPA > Spring data JPA' 카테고리의 다른 글
SPRING DATA JPA 공부 5 - EntityListener 활용 (0) | 2021.05.29 |
---|---|
SPRING DATA JPA 공부 4 - Query Method 활용 2 ( 정렬과 페이징) (1) | 2021.05.28 |
SPRING DATA JPA 공부 2- JPA 메서드 살펴보기 (0) | 2021.05.27 |
SPRING DATA JPA 공부 1 - JPA 란? (0) | 2021.05.27 |
Spring Data JPA 반환타입 (0) | 2020.11.20 |