쿼리문을 메서드 형태로 작성하는 기능이다.
지금까지 아래 코드와 같이 findById() 메서드를 통해서 id 값으로 검색을 했는데 이는 정확히 말 하면 findBy라는 문법을 보면 JPA가 자동으로 select 쿼리 구문을 실행 (select *from user where id = ?) 시켰는데 QueryMethod를 통해서 회원의 계정 혹은 아이디로 검색하고자 한다. findByAccountAndEmail(String account, String email)와 같이 And 단위로 값을 같이 찾을 수 있다.
Optional<User> user = userRepository.findById(1L);
// jpa는 findBy 까지 보고 select 문인지 파악하고 Account와 매칭
// select *from user where account = ? << test03, test03
Optional<User> findByAccount(String account);
Optional<User> findByEmail(String email);
// select *from user where account = ? and email = ?
Optional<User> findByAccountAndEmail(String account, String email);
--> Optional<User> user = userRepository.findByAccount("TestUser03");
엔티티 안에 컬럼을 하나의 객체처럼 사용하고자 할 때 사용하는 어노테이션이다. 하나의 객체로 사용할 dto 클래스에서 @Embeddable를 선언하고, 엔티티 클래스의 객체 필드에 @Embedded를 붙여주면 된다.
@Embeddable
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Birthday {
private int yearOfBirthday;
private int monthOfBirthday;
private int dayOfBirthday;
}
// jpql로 엔티티 기반으로 쿼리를 실행, Person 엔티티에서 get처럼 birthday의 monthOfBirthday에서 1번째 인자를 가져옴
// ?를 사용하면 파라미터의 순서대로 인자를 가져옴
@Query(value = "select person from Person person where person.birthday.monthOfBirthday = ?1 and person.birthday.dayOfBirthday = ?2")
List<Person> findByMonthOfBirthday(int monthOfBirthDay, int dayOfBirthday);
// @Param으로 파라미터값을 인자로 치환, 위 ? 숫자보다 더 직관적이다.
@Query(value = "select person from Person person where person.birthday.monthOfBirthday = :monthOfBirthday and person.birthday.dayOfBirthday = :dayOfBirthday")
List<Person> findByMonthOfBirthday(@Param("monthOfBirthday") int monthOfBirthDay, @Param("dayOfBirthday") int dayOfBirthday);
// nativeQuery = true를 붙여주면 실제 쿼리와 같은 형태로 쓸 수 있다.
@Query(value = "select * from person where month_of_birthday = :monthOfBirthday and day_of_birthday = :dayOfBirthday", nativeQuery = true)
List<Person> findByMonthOfBirthday(@Param("monthOfBirthday") int monthOfBirthDay, @Param("dayOfBirthday") int dayOfBirthday);