minlog
article thumbnail

 

@Query

 

쿼리 메서드의 커스텀 버전이라고 생각할 수 있다. 

보통 쿼리 메서드 만으로 일반적인 기능들을 처리할 수 있다. 하지만 다음의 두가지 케이스에서 필요하다.

 

쿼리메서드의 문제점을 보완해줄 수 있다.

1. 쿼리메서드의 가독성 문제

1) 쿼리메서드의 이름이 길어지는 경우

ex) 카테고리 = null , 이름 =파라미터와 같은것 ,created_at  파라미터 값보다 크거나 같은것, updated_at 파라미터 값보다 크거나 같은 것을 조회

List<Book> findByCateqoryIsNullAndNameEqualsAndCreatedAtGreaterThanEqual(String name, LocalDateTime createAt,LocalDateTime updateAt);

 

- 수정 된 소스 :  JPQL 을 사용하게 된다. 

  • ?번호 : 파라미터를 순차적으로 추가 해준다.

하지만 파라미터값이 변경되거나 추가될 경우 문제가 생길 수 있기때문에 지양한다.

@Query(value = "select b from Book b"
		+"where name = ?1 and createdAt >= ?2 and updatedAt >= ?3 and category is null")
List<Book> findByNameRecently(String name, LoaclDateTime createdAt, LoaclDateTime updatedAt)
  • @Param 어노테이션을 사용하여 값을 추가해준다. 
@Query(value = "select b from Book b"
		+"where name = :name and createdAt >= :createdAt and updatedAt >= :updatedAt and category is null")
List<Book> findByNameRecently(@Param("name") String name,@Param("createdAt") LoaclDateTime createdAt,@Param("updatedAt") LoaclDateTime updatedAt)

 

 

2)  Entity에 연결되지 않은 쿼리가 가능하다.⭐

ex) 카테고리 = null , 이름 =파라미터와 같은것 ,created_at  파라미터 값보다 크거나 같은것, updated_at 파라미터 값보다 크거나 같은 것을 조회

 

📑 BookAndCategory.java

public interface BookNameAndCategory{
    String getName();
    String getCategory();
}

📑 BookRepository.java (interface)

@Query(value="select b.name as name, b.category as category from Book b")
List<BookNameAndCategory> findBookNameAndCategory();

📑 테스트 코드

bookReposit.findBookNameAndCategory().forEeach(
	b -> {System.out.println(b.getName() + ":" + b.getCategory())}
);

 

 

 

 


 

Native Query

DB에서 사용하는 SQL쿼리를 그대로 사용하게된다.

최소한으로 사용하는게 좋다. 

 

- 방언을 사용하지 않게된다. 

  • Entity 속성 명을 사용하지 못한다.
  • Entity 객체에 어노테이션으로 선언한 where 절이 포함이 되지 않는다.
@Query(value="select * from book", nativeQuery = true)
List<Book> findAllCustom();

 

 

- 그럼에도 사용하는 이유?

  • 성능 문제 해결  ( ex. Update Query )
@Transactional
@Modifying
@Query(value = "update book set category = '테스트'", nativeQuery =true)
int updateCategories();

 

profile

minlog

@jimin-log

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!