본문 바로가기
학습/DB

@Query 활용하기 2

by 코동이 2021. 9. 26.

*@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