본문 바로가기
Back-End/Spring

쿼리 메서드, @Query

by sharekim 2021. 5. 12.

Spring Data JPA의 쿼리 기능은 아래와 같은 방법을 제공합니다.

 

  • 쿼리 메서드 :  메서드의 이름 자체가 쿼리의 구문으로 처리되는 기능
  • @Query     : SQL과 유사하게 엔티티 클래스의 정보를 이용해서 쿼리를 작성하는 기능
  • Querydsl 등의 동적쿼리 처리 기능

쿼리메서드

메서드의 이름 자체가 query 문이 되는 기능입니다. 간단한 쿼리를 조회할 때 사용하면 좋습니다.

아래는 쿼리메서드 명명 방법입니다.

 

Table 3. Supported keywords inside method names

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);

 

  1. :'파라미터명' 과 같이 사용하는 방식
  2. #{ } 과 같이 객체를 사용하는 방식

으로도 사용할 수 있습니다.

 

@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

댓글