카테고리 없음
[DataJPA] 메소드명으로 JPA NamedQuery 호출 (실무X)
김긍수
2021. 4. 14. 09:14
- 쿼리메소드 기능 3가지
- 메소드 이름으로 쿼리를 생성한다.
- 메소드 이름으로 JPA NamedQuery를 호출한다.
- @Query 어노테이션을 사용해서 레포지토리 인터페이스에 쿼리를 직접 정의할 수 있다.
JPA NamedQuery (실무에서 쓸 일은 많이 없음)
JPA의 NamedQuery를 호출할 수 있다.
<<순수 JPA에서 NamedQuery사용>>
@NamedQuery(name="Member.findByUsername", query="select m from Member m where m.username = :username")
public class Member {
...
}
엔티티에 @NamedQuery 어노테이션을 추가한다.
레포지토리에서 findByUsername(String username) {
em.createNameQuery("Member.findByUsername", Member.class).setParameter("username", "랄랄").getResultList(); 적으면 사용할 수 있다.
<<스프링 데이터 JPA>>
public interface MemberRepository extends JpaRepository<Member, Long> {
@Query(name = "Member.findByUsername")
List<Member> findByUsername(@Param("username") String username);
}
@Param은 엔티티의 @NamedQuery에서 :username으로 받아오는 것.
해당 메서드는 JPQL을 @Query로 찾는다.
또 @Query가 없어도 동작한다. 관례가 있기때문에, findByUsername이라는 namedQuery를 먼저 찾는다.-> JpaRepository<타입, ID타입> 에서 타입.메소드명으로 NamedQuery를 찾음.
쿼리를 찾는 우선순위
1. NamedQuery를 찾는다. 없다면? 2순위로
2. 메소드이름으로 쿼리를 생성하는 것으로 따른다.
중요! 큰 장점은 오타가 났을 때, 애플리케이션 로딩 시점에 문법오류를 알려준다.
하지만 이 방법은 실무에서 잘 사용하지 않는다. 알아는 둘 것!!!