@Repository
public interface MemberJpaRepository extends JpaRepository<Member, Long> {
List<Member> findByNameAndEmail(String name, String email);
@Query("select m from Member m where m.name = :name and m.email = :email")
List<Member> findUser(@Param("name") String name, @Param("email") String email);
}
findByNameAndEmail은 JpaRepository를 extends한 인터페이스에서 메서드 이름으로 데이터를 조회할 조건을 지정하는 방식입니다. 이 방법은 내부적으로 JPQL을 생성해주는 Spring Data JPA의 기능을 사용하는 것으로, 아래의 Create Query 가이드를 보면 적용 방법을 찾을 수 있습니다.
https://spring.io/ > Projects > Spring Data > Spring Data JPA > Learn > {VERSION} > Reference Doc.
Spring Data JPA - Reference Documentation
Example 109. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del
docs.spring.io
findUser는 @Query Annotation을 사용해서 직접 JPQL을 지정하는 방법입니다. @Query로 지정된 JPQL은 이름이 없는 named query로서 동작합니다. 애플리케이션 컴파일타임에 파싱을 해보고, 오류가 발생하면 컴파일 에러가 발생합니다.
검색 조건이 단순한 경우 CreateQuery로 사용하고 검색 조건이 3개 이상이라서 메서드 이름이 너무 길어지는 경우 후자의 방식을 사용하는 것이 좋습니다.
'DEV > Spring Data JPA' 카테고리의 다른 글
Join과 Pagination 함께 사용할 때 Count 쿼리 최적화 (0) | 2023.09.24 |
---|---|
COUNT 쿼리, Page<T> vs Slice<T> (0) | 2023.09.24 |
데이터 조회의 반환값 T vs Optional<T> (0) | 2023.09.24 |
getOne vs findById (0) | 2023.09.24 |
findOne vs findById (0) | 2023.09.24 |