다양한 검색 조건에 대한 부분(특정한 범위, like 처리, 여러 검색 조건)을 위해 JPA가 제공하는 방식
- 쿼리 메서드 : 메서드의 이름 자체가 쿼리의 구문으로 처리되는 기능
- @Query: SQL과 유사하게 엔티티 클래스의 정보를 이용해서 쿼리를 작성하는 기능
쿼리 메서드)
- 주로 SQL에서 사용되는 키워드와 동일하게 작성되어 있음
- select를 하는 작업이라면 List 타입이나 배열을 이용할 수 있음
- 파라미터에 Pageable 타입을 넣는 경우 무조건 Page<E> 타입
- 'Spring Data JPA Reference'를 이용하여 찾아볼 수 있음
쿼리 메서드 예제1) Memo 객체의 mno 값이 70~80 사이의 객체들을 구하고 mno를 역순으로 정렬
인터페이스 추가)
테스트 클래스)
쿼리메서드 예제2) 쿼리 메서드와 Pageable의 결합
인터페이스 추가)
테스트 클래스 추가)
정렬 조건을 Pageable을 통해서 조절하여 좀 더 간단한 형태의 메서드 선언이 가능
@Query 어노테이션
- 메서드의 이름과 상관없이 메서드에 추가한 어노테이션을 통해서 원하는 처리가 가능
- @Query의 value는 JPQL(객체지향 쿼리)로 작성
- 필요한 데이터만 선별적으로 추출하는 기능
- 데이터베이스에 맞는 순수한 SQL(Native SQL)을 사용하는 기능
- select가 아닌 DML등을 처리하는 기능(@Modifying과 함께 사용)
- 쿼리 메서드의 경우 엔티티 타입의 데이터만을 추출하나, @Query의 경우 현재 필요한 데이터만을 Object[]로 리턴한다. ( JPQL를 이용할 경우 JOIN이나 GROUP BY를 이용하는 경우가 종종 있는데 이럴 때 적당한 엔티티 타입이 존재하지 않는 경우가 많기에 이런 상황에서 유용하게 Object[]타입을 리턴 타입으로 지정할 수 있음)
@Query의 파라미터 바인딩 )
인터페이스 추가)
테스트 클래스 추가)
@Query의 경우 SQL과 유사한 형태로 작성되기 때문에 'where'구문과 그에 맞는 파라미터를 처리할 때가 많아
':파라미터 이름'을 활용하는 방식으로 위와 같이 사용
@Query와 페이징 처리)
인터페이스 추가)
테스트 클래스 추가)
실제로 위 코드를 테스트 할 때 Page리턴 타입으로 선언해두고 결과를 찍는 부분에서 forEach구문 없이 그냥 System.out.println()으로 적어서 결과가 안나와서 당황했다..(바보인듯)
'코드로 배우는 스프링부트 웹 프로젝트' 카테고리의 다른 글
Springboot) 자동으로 처리되는 날짜/시간 설정 , JPA객체의 범위 (0) | 2021.12.02 |
---|---|
Springboot)Thymeleaf 의 사용법 (0) | 2021.11.26 |
Springboot) MVC패턴 (0) | 2021.11.26 |
Springboot) 페이징(Pageable)/정렬(sort) 처리 (0) | 2021.11.25 |
Springboot) ORM,JPA,Hibernate,JPA를 통한 CRUD처리 (0) | 2021.11.24 |