→ 각각의 기능 설명을 회원의 이름과 나이로 조회하는 예제를 통해 알아 볼 것입니다.
메소드 이름으로 쿼리 생성
→ 메소드 이름을 분석해서 JPQL 쿼리 실행
순수 JPA 리포지토리::MemberJpaRepository
public List<Member> findByUsernameAndAgeGreaterThan(String username, int age) {
return em.createQuery("select m " +
"from Member m " +
"where m.username = :username and m.age > :age", Member.class)
.setParameter("username", username)
.setParameter("age", age).getResultList();
}
스프링 데이터 JPA
List<Member> findByUsernameAndAgeGreaterThan(String username, int age);
메소드 이름으로 JPA NamedQuery 호출
→ JPA의 NamedQuery를 호출할 수 있다.
Entity
에 @NamedQuery
를 정의
/* Entity Area */
@Entity
@NamedQuery(name="Member.findByUsername",
query="select m from Member m where m.username = :username"
)
public class Member {
...
}
순수 JPA를 이용한 NamedQuery 호출
public class MemberRepository {
public List<Member> findByUsername(String username) {
...
List<Member> resultList = em.createNamedQuery("Member.findByUsername", Member.class)
.setParameter("username", username)
.getResultList();
}
}
스프링 데이터 JPA를 이용한 NamedQuery 사용
@Query(name = "Member.findByUsername")
List<Member> findByUsername(@Param("username") String username);
→ @Query
를 생략하고 메서드 이름만으로 NamedQuery 호출이 가능하다.
@Query
어노테이션을 사용해서 리파지토리 인터페이스에 쿼리 직접 정의
스프링 데이터 JPA를 이용한 NamedQuery 호출
List<Member> findByUsername(@Param("username") String username);
참고: 스프링 데이터 JPA를 사용하면 실무에서 NamedQuery를 직접 등록해서 사용하는 일은 드물다. 대신
@Query
를 사용해서 리파지토리 메서드에 쿼리를 직접 정의한다.
@Query("select m from Member m where m.username= :username and m.age = :age" )
List<Member> findUser(@Param("username") String username, @Param("age") int age);
@Query
어노테이션을 사용한다.