SpringBoot with JPA @Query 어노테이션

mingki·2022년 1월 28일
0

SpringBoot & JPA

목록 보기
6/26


📚 공부한 책 : 코드로배우는 스프링 부트 웹프로젝트

1. @Query 어노테이션

@Query는 조인이나 복잡한 조건을 처리해야 하는경우 JPA가 제공하는 쿼리메소드를 사용하기 불편할때 사용한다
@Query 는 메서드의 이름과 상관없이 메서드에 추가한 어노테이션을 통해 원하는 처리가 가능하다
-> @Query의 value는 JPQL로 작성한다 => 흔히 객체지향 쿼리라고 불리우는 구문들이다

☀︎ @Query를 이용해 실행할 수 있는 작업

  • 필요한 데이터만 선별적으로 추출하는 기능
  • DB에 맞는 순수한 SQL(Native SQL)을 사용하는 기능
  • select가 아닌 DML(insert, update, delete)등을 처리하는 기능(@Modifiying과 함께 사용)
    ☆ 객체지향 쿼리는 테이블 대신 엔티티 클래스를 이용하고 테이블의 컬럼 대신 클래스에 선언된 필드를 이용해서 작성한다
  • 사용예시
@Query("select m from Memo m order by m.mno desc")
        List<Memo> getListDesc();

2. @Query의 파라미터 바인딩

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

3. @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);

4. Native SQL처리

@Query의 강력한 기능은 DB의 고유한 SQL 구문을 그대로 활용하는것이다
JPA가 DB에 독립적으로 구현이 가능하다는 장점을 잃어버리기는 하지만 복잡한 조인구믄 등을 처리하기 위해 어쩔수 없는 선택을 하는경우 사용한다

  • 사용예시
// nativeQuery 속성값을 true로 지정하고 일반 SQL을 그대로 사용할 수 있다
@Query(value = "select * from memo where mno > 0" , nativeQuery = true)
List<Object[]> getNativeResult();
profile
비전공초보개발자

0개의 댓글