@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();
'Back-End > Spring' 카테고리의 다른 글
[JPA] ddl-auto 주의 및 실무 적용 (0) | 2022.08.01 |
---|---|
[spring boot] 간단한 방명록 만들기 [2편] (0) | 2022.06.16 |
[spring boot] JPA 페이징/정렬 처리 (0) | 2022.06.14 |
[spring boot] JPA로 CRUD 테스트 (0) | 2022.06.10 |
[Spring boot] JPA & MariaDB 테이블생성 (0) | 2022.06.10 |