public interface MemberRepository extends JpaRepository<Member, Long> {

    List<Member> findByUsernameAndAge(String username, int age);

}

순수 JPA 리포지토리

public List<Member> findByUsernameAndAge(String username, int age) {
    return em.createQuery("select m from Member m where m.username = :username and m.age > :age")
            .setParameter("username", username)
            .setParameter("age", age)
            .getResultList();
}

 

순수 JPA 테스트 코드

 

@Test
public void findByUsernameAndAge(){
    Member member1 = new Member("AAA", 10);
    Member member2 = new Member("AAA", 20);

    memberJpaRepository.save(member1);
    memberJpaRepository.save(member2);

    List<Member> result = memberJpaRepository.findByUsernameAndAge("AAA", 15);

    Assertions.assertThat(result.get(0).getUsername()).isEqualTo("AAA");
    Assertions.assertThat(result.get(0).getAge()).isEqualTo(20);

}

 

스프링 데이터 JPA

public interface MemberRepository extends JpaRepository<Member, Long> {

    List<Member> findByUsernameAndAgeGreaterThan(String username, int age);

}

스프링 데이터 JPA는 메소드 이름을 분석해서 JPQL을 생성하고 실행

 

쿼리 메소드 필터 조건
스프링 데이터 JPA 공식 문서 참고: (https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation)


스프링 데이터 JPA가 제공하는 쿼리 메소드 기능
조회: find…By ,read…By ,query…By get…By, 
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-creation
예:) findHelloBy 처럼 ...에 식별하기 위한 내용(설명)이 들어가도 된다.


COUNT: count…By 반환타입 long
EXISTS: exists…By 반환타입 boolean
삭제: delete…By, remove…By 반환타입 long
DISTINCT: findDistinct, findMemberDistinctBy
LIMIT: findFirst3, findFirst, findTop, findTop3
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/
#repositories.limit-query-result


> 참고: 이 기능은 엔티티의 필드명이 변경되면 인터페이스에 정의한 메서드 이름도 꼭 함께 변경해야 한다. 그렇지 않으면 애플리케이션을 시작하는 시점에 오류가 발생한다.
> 이렇게 애플리케이션 로딩 시점에 오류를 인지할 수 있는 것이 스프링 데이터 JPA의 매우 큰 장점이다.

 

 

 

출처 : 김영한 JPA 스프링 데이터 강의

'JPA > JPA-Spring Data' 카테고리의 다른 글

@Query, 리포지토리 메소드에 쿼리 정의하기  (0) 2022.07.20
JPA NamedQuery  (0) 2022.07.19
공통 인터페이스 설정  (0) 2022.07.19
순수 JPA 기반 리포지토리 만들기  (0) 2022.07.19
예제 도메인 모델  (0) 2022.07.19
복사했습니다!