Spring Data JPA의 쿼리 기능은 아래와 같은 방법을 제공합니다.
- 쿼리 메서드 : 메서드의 이름 자체가 쿼리의 구문으로 처리되는 기능
- @Query : SQL과 유사하게 엔티티 클래스의 정보를 이용해서 쿼리를 작성하는 기능
- Querydsl 등의 동적쿼리 처리 기능
쿼리메서드
메서드의 이름 자체가 query 문이 되는 기능입니다. 간단한 쿼리를 조회할 때 사용하면 좋습니다.
아래는 쿼리메서드 명명 방법입니다.
docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation
Spring Data JPA - Reference Documentation
Example 109. Using @Transactional at query methods @Transactional(readOnly = true) public interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") v
docs.spring.io
쿼리메서드를 이용해서 order by 의 범위(Like Limit)를 지정하고 싶다면
List<Memo> findByMnoBetweenOrderByMnoDesc(Long from , Long to);
Page<Memo> findByMnoBetween(Long from, Long to, Pageable pageable);
와 같이 Repository에 추가해서 사용할 수 있습니다. Pageable을 파라미터에 추가해서 사용할 수도 있습니다.
@Query
쿼리메서드보다 복잡한 쿼리를 작성해야 하는 경우 @Query를 사용하면 좋습니다. (간단한 것도 당연히 가능)
@Query("쿼리내용") 의 형태로 작성해주면 됩니다. 아래는 예시입니다.
@Query("select m from Memo m order by m.mno desc")
List<Memo> getListDesc();
@Transactional
@Modifying
@Query("update Memo m set m.memoText = :memoText where m.mon = :mno")
int updateMemoText(@Param("mno") Long mno, @Param("memoText" String memoText);
@Transactional
@Modifying
@Query("update Memo m set m.memoText = #{#memoText} where m.mon = #{#mno}")
int updateMemoText(@Param("param") Memo memo);
- :'파라미터명' 과 같이 사용하는 방식
- #{ } 과 같이 객체를 사용하는 방식
으로도 사용할 수 있습니다.
@Query에서 Pageable 사용
@Query(value="seelct 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);
위와 같은 쿼리로 Pageable을 파라미터로 사용할 수 있습니다.
@Query에 value와 countQuery로 속성을 적용해주고 Pageable 파라미터를 전달하면 됩니다.
Object[] 리턴
@Query를 사용하는 경우 현재 필요한 데이터만을 Object[]의 형태로 선별 추출이 가능하다는 점입니다.
JPQL을 이용할 때 경우에 따라서 JOIN이나 GROUP BY 등을 이용하는 경우가 있는데,
이럴 때 Object[] 타입으로 리턴을 지정할 수 있습니다.
@Query(value = "select m.mno, m.memoText, CURRENT_DATE, from Memo m where m.mno > :mno",
countQuery = "select count(m) from Memo m where m.mno > :mno")
Page<Object[]> getListWithQueryObject(Long mno, Pageable pageable);
Native SQL 처리
경우에 따라서 복잡한 JOIN 구문 등을 처리하기 위해 Natvie SQL 처리를 할 수 있습니다.
Query(value="select * from memo where mno > 0", nativeQuery = true)
List<Object[]> getNativeResult();
@Query의 nativeQuery 속성을 true로 지정하고 SQL을 사용하면 됩니다.
'Back-End > Spring' 카테고리의 다른 글
JPA Paging(Page, Pageable, PageRequest, Sort) (0) | 2021.05.12 |
---|---|
JpaRepository (0) | 2021.05.12 |
엔티티 클래스 (0) | 2021.05.12 |
Spring Context Root 경로 (Resources 경로) (0) | 2021.03.21 |
Spring AOP 용어 정리 (0) | 2021.03.21 |
댓글