파라미터 바인딩
- 위치 기반
- 이름 기반 (사용 권장!)
select m from Member m where m.username = ?0 //위치 기반
select m from Member m where m.username = :name //이름 기반
*이름 기반 파라미터 바인딩을 권장한다. 위치 기반은 가독성도 좋지 않고 순서가 바뀌는 실수가 일어날 수 있다.
예시)
public interface MemberRepository extends JpaRepository<Member, Long> {
@Query("select m from Member m where m.username = :name")
Member findMembers(@Param("name") String username);
}
컬렉션 파라미터 바인딩
Collection 타입으로 in절을 지원한다. (편하게 in 절을 작성 가능)
예시)
@Query("select m from Member m where m.username in :names")
List<Member> findByNames(@Param("names") List<String> names);
반환 타입
스프링 데이터 JPA는 유연한 반환타입을 지원한다.
참고문서: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repository-query-return-types
예시)
List<Member> findByUsername(String name); //컬렉션
Member findByUsername(String name); //단건
Optional<Member> findByUsername(String name); //단건 Optional
IF 조회 결과가 많거나 없다면?
컬렉션 조회:
- 결과 없으면 빈 컬렉션을 반환한다. (컬렉션은 null을 반환하지 않는다.)
단건 조회:
- 결과 없으면 null 반환 한다.
- 결과가 2건 이상이면 javax.persistence.NonUniqueResultException 예외 발생한다.
참고:
단건으로 지정한 메서드를 호출하면 스프링 데이터 JPA는 내부에서 JPQL의 Query.getSingleResult() 메서드를 호출한다. 이 메서드를 호출했을 때 조회 결과가 없으면 javax.persistence.NoResultException 예외가 발생하는데 개발자 입장에서 다루기가 상당히 불편하다. 스프링 데이터 JPA는 단건을 조회할 때 이 예외가 발생하면 예외를 무시하고 대신에 null 을 반환한다.
'💻dev > 🌱Java+Spring' 카테고리의 다른 글
Spring Data JPA | 벌크성 수정 쿼리 (순수 JPA와 스프링 데이터 JPA 비교) (0) | 2023.05.09 |
---|---|
Spring Data JPA | 순수 JPA와 스프링 데이터 JPA의 페이징과 정렬 비교하기 (0) | 2023.05.09 |
Spring Data JPA | @Query, 값, DTO 조회하기 (0) | 2023.05.09 |
Spring Data JPA | 마법같은 쿼리 메소드 기능과 @Query (0) | 2023.05.08 |
JPA | JPQL 중급 문법 뿌시기 - 다형성 쿼리, 엔티티 직접 사용, Named 쿼리, 벌크 연산 (0) | 2023.05.04 |