*@Query에서 매개변수 순서 사용하여 조회하기
List<Book> findByCategoryIsNullAndNameEqualsAnd
CreatedAtGreaterThanEqualAndUpdatedAtGreaterThanEqual
(String name, LocalDateTime createdAt, LocalDateTime updatedAt)
@Query를 사용해서 긴 조회의 내용을 줄일 수 있다. 물음표 숫자를 이용해 몇번째에 있는 매개변수 인지 매칭시킨다.
@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, LocalDateTime createdAt, LocalDateTime updatedAt);
@Query를 통해 테이블을 조회하는 것이 아니라, 엔티티를 조회한다. @Query안에 있는 칼럼명을 잘 보면, 테이블의 칼럼명이 아닌 엔티티의 칼럼명이다. ( 테이블의 칼럼명은 created_at과 updated_at이다.) 하지만 순서를 따라서 매핑하기 때문에 매개변수의 위치에 따라서 값이 바뀔 위험이 있으므로 잘 사용하지 않는다.
*@Query에서 매개변수 바인딩 사용해서 조회하기
@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")LocalDateTime createdAt,
@Param("updatedAt")LocalDateTime updatedAt);
파라미터명과 직접 매칭시키기 때문에, 순서가 바뀌더라도 금방 확인할 수 있으므로 더 안전하게 처리할 수 있다. 또한 @Query를 사용하는 이유는, 엔티티 중에 필요한 쿼리들만 조회가 가능한 장점이 있다. 필요한 컬럼들만 추려서 조회가 가능하다.
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BookNameAndCategory {
private String name;
private String category;
}
@Query(value = "select b.name as name, b.category as category from Book b")
List<Tuple> findBookNameAndCategory();
Book에서부터 조회해오는 값들은 리턴형이 BookAndCategory로 받지 않고 Tuple을 통해서 받는다.
반응형
'학습 > DB' 카테고리의 다른 글
고아제거 속성 알아보기 (0) | 2021.09.26 |
---|---|
Cascade 활용하기 (0) | 2021.09.26 |
@Query 활용하기 1 (0) | 2021.09.26 |
Transaction 격리수준 (0) | 2021.09.26 |
db Transaction(롤백처리) (0) | 2021.09.26 |