[JPA] @Query 어노테이션 사용시 주의점 정리

아래와 같이 메서드를 작성했으나 실행되지 않았다

 @Query("SELECT p FROM Post p WHERE p.postType = :postType AND p.id = :id")
    void findPostByPostTypeAndId(PostType postType, long id);

주의해야할 것
1. jpa 는 table 이름이 아니라 entity 이름이 들어가야한다
2. findBy 는 <Optional> 로 반환해야한다


 @Query("SELECT p FROM Post p WHERE p.postType = :postType AND p.id = :id")
Optional<Post> findPostbyPostTypeAndId(@Param("postType") PostType postType, @Param("id") Long id)

이렇게 고칠 수 있다



@Query () 를 없애고 아래처럼 작성할 경우 정상 실행된다

Optional<Post> findPostByIdAndPostType(long id, PostType postType);


기억해야 하는 것

1. JPA는 메서드 이름으로 추론해서 쿼리를 생성한다. (규칙 존재)
2. @Query 어노테이션을 사용해서 이름 무시하고 바로 쿼리 실행하게 할 수 있다.
3. @Query 어노테이션을 사용할때 파라미터가 있으면 반드시 파라미터를 지정해줘야하는데 방법이 2가지다

  • 3-1 순서로 지정하기
    순서로 지정하는 것은 select p  from Post p where postType = ?1 처럼 할 수 있다
  • 3-2 이름으로 지정하기
    는 :id, :postType 같은건데, 이렇게 하면 반드시 @Param 어노테이션을 파라미터 앞에 붙여야한다.