쿼리메서드 기능과 JPQL(Java Persistence Query Language)는 JpaRepository가 제공하는 객체 지향 쿼리에 대한 기능이다. 여러 검색조건이 필요 할 때 사용할 수 있다.
쿼리메서드
메서드의 이름 자체가 쿼리의 구문으로 처리되는 기능
주로 'findBy', 'getBy'로 시작한다
//엔티티의 타입정보와 @id타입 지정하기
public interface MemoRepository extends JpaRepository<Memo,Long> {
List<Memo> findByMnoBetweenOrderByMnoDesc(Long from,Long to);
}
@Test
public void testQueryMethods(){
List<Memo> list = memoRepository.findByMnoBetweenOrderByMnoDesc(70L,80L);
for (Memo memo : list){
System.out.println(memo);
}
}
//엔티티의 타입정보와 @id타입 지정하기
public interface MemoRepository extends JpaRepository<Memo,Long> {
Page<Memo> findByMnoBetween(Long from, Long to, Pageable pageable);
}
@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을 그대로 사용할 수 있다.