스프링부트 쿼리메서드(Query Methods)기능과 @Query

Ina Kim·2021년 5월 25일
0

SpringBoot

목록 보기
2/2

쿼리메서드 기능과 JPQL(Java Persistence Query Language)는 JpaRepository가 제공하는 객체 지향 쿼리에 대한 기능이다. 여러 검색조건이 필요 할 때 사용할 수 있다.

쿼리메서드

메서드의 이름 자체가 쿼리의 구문으로 처리되는 기능
주로 'findBy', 'getBy'로 시작한다

  • 예를 들어 70부터 80사이의 객체들을 구하고 mno의 역순으로 정렬하고싶다면?

MemoRepository

//엔티티의 타입정보와 @id타입 지정하기
public interface MemoRepository extends JpaRepository<Memo,Long> {

    List<Memo> findByMnoBetweenOrderByMnoDesc(Long from,Long to);

}

MemoRepositoryTests

    @Test
    public void testQueryMethods(){

        List<Memo> list = memoRepository.findByMnoBetweenOrderByMnoDesc(70L,80L);

        for (Memo memo : list){
            System.out.println(memo);
        }
    }

테스트결과


  • pageable과 같이 처리하려면?

MemoRepository

//엔티티의 타입정보와 @id타입 지정하기
public interface MemoRepository extends JpaRepository<Memo,Long> {

    Page<Memo> findByMnoBetween(Long from, Long to, Pageable pageable);

}

MemoRepositoryTests

    @Test
    public void testQueryMethodWithPageable(){

        Pageable pageable = PageRequest.of(0,10,Sort.by("mno").descending());

        Page<Memo> result = memoRepository.findByMnoBetween(10L,50L,pageable);
        
        result.get().forEach(memo -> System.out.println(memo));
    }

테스트결과

@Query

SQL과 유사하게 엔티티 클래스의 정보를 이용해서 쿼리를 작성하는 기능

간단처리만 쿼리메서드를 사용하고 보통은 @ Query를 이용하는 경우가 많다.
@Query의 value는 JPQL로 작성하는데 흔히 '객체지향 쿼리'라고 불리운다.

@Query(value = "select m from Memo m where m.mno> :mno",
			countQuery = "select count(m) from Memo m WHERE m.mno > :mno")            
            

Page<엔티티>으로 지정하는 경우에는 count를 계산할 수 있는 쿼리가 필수적이다.
countQuery를 이용해서 Pageable 타입의 파라미터를 전달하면 된다.


@Query(value = "select * from memo where mno> 0", nativeQuery = true)            
            

@Query의 강력한 기능은 데이터베이스 고유의 SQL구문을 그대로 활용할 수 있다.
복잡한 JOIN구문 등을 처리하기 위해서 어쩔 수 없이 사용하는 경우이다.
nativeQuery 속성값을 true 지정하고 일반 SQL을 그대로 사용할 수 있다.

profile
기록하는것을 좋아합니다

0개의 댓글