Query Method

Red Culture·2021년 7월 6일

Query Method란

쿼리문을 메서드 형태로 작성하는 기능이다.
지금까지 아래 코드와 같이 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");

@Embeddable, @Embedded

엔티티 안에 컬럼을 하나의 객체처럼 사용하고자 할 때 사용하는 어노테이션이다. 하나의 객체로 사용할 dto 클래스에서 @Embeddable를 선언하고, 엔티티 클래스의 객체 필드에 @Embedded를 붙여주면 된다.

@Embeddable
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Birthday {
    private int yearOfBirthday;
    private int monthOfBirthday;
    private int dayOfBirthday;
}

JPQL

// 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);
profile
자기 개발, 학습 정리를 위한 블로그

0개의 댓글