-마지막 으로 살펴볼 기능은 쿼리메서드와 JPQL
이라고 불리는 객체 지향 쿼리에 대한 기능이다.
WHY Query method???
-앞의 예제에서 아쉬운 점은 다양한 검색 조건 이 불가능 하다는 점이다
-이 문제를 해결하기 위해 Spring data jpa 에서는 다음과 같은 방법을 제공한다.
-쿼리메서드는 말그대로 '이름 자체가 질의문' 되는 기능이다.
-MemoRepository에 해당 쿼리메서드를 추가 해준다.
※ 우리가 db에서 원하는 정보를 넣고뺴고(비즈니스 로직,실질적 기능) 을 repository에 작성을 하면 된다.
2.정렬+페이징
pagerequest.of 로 페이즈,사이즈, 정렬조건으로 pageable을 만들어준다
만들어둔 쿼리메서드에 대입해준다.
※pageable 파라미터는 모든 쿼리 메서드에 적용할수 있다.
3.삭제
테스트 코드인경우 @Transactional 과 @Commit 라는 어노테이션을 사용한다. 이것은 deleteBy 인경우 우선 select문으로 해당 객체들을 가져오고 각엔티티를 삭제하는 작업이 같이 이루어지기 떄문이다
@Commit는 최종 결과를 커밋하기 위해 사용한다. 이를 적용 하지 않으면 테스트 코드의 deleteBy는 기본적으로 롤백 으로 처리되어 결과가 반영되지 않는다.
※ deleteBy는 많이 사용되지 않는데 그이유는 각 엔티티객체를 하나씩 삭제하기 때문이다.
-일반적인 간단한 처리만 쿼리메서드를 이용하고, @Query를 이용하는 경우가 더 많다.
-@Query의 value는 JPQL 로 작성하는데 흔히 '객체지향 쿼리'라고 불린다
※객체지향 쿼리는 테이블 대신에 엔티티 클래스를 이용하고 테이블의 칼럼 대신에 클래스에 선언된 필드를 이용해서 작성한다.
-@Query 장점 중의 하나는 쿼리 메서드의 경우에는** 엔티티 타입의 데이터만 추출
-쿼리메서드와 마찬가지로 @Query를 사용할 경우에 Pageable 타입의 파라미터를 적용하면 페이징 처리와 정렬에 대한 부분을 작성하지 않을 수 있다.
-리턴타입을 page<엔티티 타입> 으로 지정하는 경우에는 count를 처리하는 쿼리를 적용 할수있다.
※따라서 @Query를 사용할때 별도의 countQuery라는 속성을 적용해 주고 Pageable 타입의 파라미터를 전달하면 된다.
@Query(value = "SELECT m from Memo m where m.mno>:mno",
countQuey= "SELECT count(m) from Memo m where m.mno>:mno")
Page<> getListWithQuery(Long mno, Pageable pageable);