본문 바로가기
Back-End/Spring

[spring boot] @Query 어노테이션

by LeeGangEun 2022. 6. 14.

@Query란?

  • JPA에서 조인이나 복잡한 조건을 처리해야 하는 경우에 사용한다.
  • 간단한 처리만 쿼리 메소드를 이용하고, 보통은 @Query를 이용하는 경우가 많다.
  • 메소드의 이름과 상관없이 메소드에 추가한 어노테이션을 통해 원하는 처리가 가능하다.
  • @Query의 value는 JPQL로 작성하는데 흔히 객체지향 쿼리라고 불리우는 구문들이다.

 

@Query 장점

  • 필요한 데이터만 선별적으로 추출하는 기능
  • DB에 맞는 순수한 SQL을 사용하는 기능
  • select가 아닌 DML(insert, update, delete)등을 처리하는 기능(@Modifiying과 함께 사용)

 

@Query 파라미터 바인딩

  • ?1. ?2' 와 1부터 시작하는 파라미터의 순서를 이용하는 방식
  • ':xxx' 와 같이 : 파라미터 이름을 활용하는 방식
  • ':#{ }’과같이 자바빈 스타일을 이용하는 방식
   // :파라미터 이용하는 방식
    @Transactional
    @Modifying                             
    @Query("update Memo m set m.memoText = :memoText where m.mno = :mno ")
    int updateMemoText(@Param("mno") Long mno, @Param("memoText") String memoText);

 

@Query와 페이징 처리

  • @Query를 이용할 때는 별도의 countQuery라는 속성을 적용해주고 Pageable 타입의 파라미터를 전달하면 된다.
@Query(value = "select m from Memo m where m.mno > :mno",
 	countQuery = "select count(m) from Memo m where m.mno > :mno" )
Page<Memo> getListWithQuery(Long mno, Pageable pageable);

 

Native SQL 처리

  • @Query의 강력한 기능은 DB 고유의 SQL 구문을 그대로 활용하는 것이다.
  • JPA 자체가 DB에 독립적으로 구현이 가능하다는 장점을 잃어버린다.
  • 경우에 따라서는 복잡한 조인 구문 등을 처리하기 위해 어쩔 수 없이 선택하기도 한다.
  • 개발 1순위는 구현이라는 것을 명심하자 !
// nativeQuery 속성값을 true로 지정하고 일반 SQL을 그대로 사용할 수 있다
@Query(value = "select * from memo where mno > 0" , nativeQuery = true)
List<Object[]> getNativeResult();