JPA - @Query

minjjai·2023년 1월 6일
0

현재 개인 토이 프로젝트에서 jpa를 사용 중이다.
기존에는 jpa를 활용해 findById, findAll, findByUsername 과 같은 단순한 메서드들만 구현을 했었다.
프로젝트를 진행하던 중 단순한 jpa로는 구현하기 까다로운 문제들을 마주했다.
그래서 구글링을 열심히 했다. 'jpa로 sql 구현하는 방법...' 등등...
어렵지 않게 @Query 어노테이션을 이용해 jpa도 sql 쿼리를 짜듯이 메서드를 구현할 수 있다는 것을 알게 되어 시도해보았다.
그래서 이 글에서는 jpa의 @Query 어노테이션을 사용하는 것에 대해 기록하려 한다.

@Query(..) - BoardRepository

@Repository
public interface BoardRepository extends JpaRepository<Board, Long> {
    Optional<Board> findByTitle(String title);

    List<Board> findByCreatorId(long creatorId);

    @Query("select b " +
            "from Board b " +
            "where b.title like %:keyword% " +
            "or b.content like %:keyword%")
    Page<Board> findByKeyword(@Param("keyword") String keyword, Pageable pageable);
}

findByTitle과 findByCreatorId메서드는 jpa의 메서드 작명규칙에 따라 생성된 메서드이다.
간단한 like검색기능 구현을 위해 검색어로 like 검색 결과를 반환하는 메서드인 findByKeyword는 @Query(...)어노테이션을 이용하였다.

@Query("select b from Board b where b.title like %:keyword% or b.content like %:keyword%")
    Page<Board> findByKeyword(@Param("keyword") String keyword, Pageable pageable);

이와 같이 한 줄로 표현이 가능하다.
줄바꿈을 할 때에는 + 등의 기호로 문자열을 연결해 주어야 한다.

select [엘리어스명] from [엔티티, 테이블 명(앞글자는 대문자)] [엘리어스명] where [엘리어스].컬럼명 like ....

위와 같은 규칙을 맞춰 쿼리문을 작성해주면 된다.

@Param("...")

그리고 메서드의 파라미터로 넘어오는 값을 @Query(..) 안에서 사용하려면 @Param("example")등의 어노테이션을 파라미터에 붙여주면 :example 의 형태로 값을 사용할 수 있다.

profile
BackEnd Developer

0개의 댓글