그렇다면 여기서 의문점이 생김
조건이 더 많아지면 메소드 이름이 너무나도 길어질텐데.. 이렇게 되면 해석하는게 더 힘들듯.
⇒ 간단한 쿼리를 처리할 때는 유용하지만, 복잡한 쿼리를 다루기엔 ❌
Spring Data JPA에서 제공하는 @Query 어노테이션을 사용하면 SQL과 유사한 JPQL이라는 객체지향 쿼리 언어를 통해 복잡한 쿼리도 처리가 가능!
SQL은 데이터베이스의 테이블을 대상으로 쿼리를 수행한다면, JPQL은 엔티티 객체를 대상으로 쿼리를 수행함.
테이블이 아닌 객체를 대상으로 검색하는 객체지향 쿼리
상품 상세 설명을 파라미터로 받아 해당 내용을 상품 상세 설명에 포함하고 있는 데이터 조회해보자. 정렬은 가격이 높은 순으로 조회함.
ItemRepository.java
@Query("select i from Item i where i.itemDetail like %:itemDetail% order by i.price desc")
// @Param: 파라미터로 넘어온 값을 JPQL에 들어갈 변수로 지정.
List<Item> findByItemDetail(@Param("itemDetail") String itemDetail);
ItemRepositoryTest.java
@Test
@DisplayName("@Query를 이용한 상품 조회 테스트")
public void findByItemDetailTest(){
this.createItemTest();
List<Item> itemList = itemRepository.findByItemDetail("테스트 상품 상세 설명");
for(Item item : itemList){
System.out.println(item.toString());
}
}
코드의 주석에도 적혀있듯, @Param 어노테이션은 변수를 JPQL에 전달할 수 있다.
상품 상세 설명에 '테스트 상품 상세 설명'을 포함하고 있는 상품 데이터 10개를 잘 보여준다.
이처럼 복잡한 쿼리는 @Query
어노테이션을 사용하며 된다!