/* 설명. 4. jpql 및 native query 활용 */
public List<CategoryDTO> findAllCategory() {
// findAll()사용해도 되지만 **이번에 jpa가 제공하지 않는 메소드를 사용해보자**
List<Category> categories = **categoryRepository.findAllCategories();**
return categories.stream()
.map(category -> modelMapper.map(category, CategoryDTO.class))
.collect(Collectors.toList());
}
@QuerySpring Data JPA는 원래 메서드 이름 기반 쿼리(findById, findAllByOrderByCategoryCodeAsc)를 자동으로 만들어준다.
그런데 복잡한 쿼리나 조건이 필요할 때는 @Query를 붙여서 직접 쿼리를 작성
두 가지 방식:
JPQL (객체지향 쿼리 언어)
→ 엔티티 이름과 필드를 대상으로 작성
→ DB 테이블 이름/컬럼명 대신 엔티티 클래스와 필드명 사용
**@Query("SELECT m FROM Category m ORDER BY m.categoryCode ASC")**
→ 여기서 Category는 엔티티 클래스 이름, categoryCode는 자바 필드명
Native SQL (DB 고유 문법)
→ RDBMS의 SQL 문법 그대로 작성
→ 실제 DB 테이블명(TBL_CATEGORY)과 컬럼명(CATEGORY_CODE)을 직접 써야 함
→ nativeQuery = true 옵션 필수
**@Query(value ="SELECT CATEGORY_CODE, CATEGORY_NAME, REF_CATEGORY_CODE FROM TBL_CATEGORY ORDER BY CATEGORY_CODE ASC",
nativeQuery = true)**
SELECT CATEGORY_CODE, CATEGORY_NAME, REF_CATEGORY_CODE FROM TBL_CATEGORY
→ 엔티티랑 매핑된 실제 테이블(tbl_category)을 직접 조회
결과는 Category 엔티티 객체로 자동 매핑
→ 이유: Category 엔티티에 같은 이름의 컬럼(category_code, category_name, ref_category_code)이 있음

매개변수를 사용하려고 하면 :으로 시작하는 변수로 사용가능
DB에 최적화된 SQL을 그대로 쓰고 싶을 때
(예: DB 특정 함수, 인덱스 힌트, JOIN 최적화, LIMIT, OFFSET 등 JPQL이 지원 안 하는 기능)
복잡한 SQL 쿼리를 JPQL로 표현하기 힘들 때
(특히 서브쿼리, UNION, DB 전용 기능)
기존 SQL을 그대로 재활용하고 싶을 때
(예: DBA가 만들어둔 SQL)