JPA의 NamedQuery 는 쿼리에 이름을 부여하고 호출하는 기능입니다.

사실 거의 실무에서 쓸 일이 없습니다.

@NamedQuery 어노테이션으로 Named 쿼리 정의

@Entity
@NamedQuery(name="Member.findByUsername",
            query="select m from Member m where m.username = :username")
public class Member {
    ... 
}

JPA를 직접 사용해서 Named 쿼리 호출

@Repository
public class MemberJpaRepository {

		public List<Member> findByUsername(String username) {
		    List<Member> resultList =
		        em.createNamedQuery("Member.findByUsername", Member.class)
		            .setParameter("username", username)
		            .getResultList();
		}
}

문제는 없다고 하지만 여전히 작성해야하는 코드가 존재합니다. 스프링 데이터 JPA로 편하게 변경해봅시다.

스프링 데이터 JPA로 NamedQuery 사용

import org.springframework.data.repository.query.Param;

public interface MemberRepository extends JpaRepository<Member, Long> {

		@Query(name = "Member.findByUsername")
		List<Member> findByUsername(@Param("username") String username);

}
  1. @Param

스프링 데이터 JPA로 Named 쿼리 호출

참고로 @Query(name = "Member.findByUsername") 를 따로 적어주지 않더라도 실행됩니다.

import org.springframework.data.repository.query.Param;

public interface MemberRepository extends JpaRepository<Member, Long> {

		//@Query(name = "Member.findByUsername")
		List<Member> findByUsername(@Param("username") String username);

}