@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();
'BackEnd > Security · JPA' 카테고리의 다른 글
[ Security ] 시큐리티 - 로그인 (0) | 2023.04.04 |
---|---|
[ JPA ] Embedded - 재활용 가능한 Entity (0) | 2023.04.02 |
[ JPA ] Cascade ( 영속성 전의 ) - 고아제속성 (0) | 2023.03.31 |
[ JPA ] Transaction (0) | 2023.03.30 |
[ JPA ] 영속성 컨텍스트와 Entity 생애주기 (0) | 2023.03.29 |