카테고리 없음

[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. 메소드이름으로 쿼리를 생성하는 것으로 따른다.

 

중요! 큰 장점은 오타가 났을 때, 애플리케이션 로딩 시점에 문법오류를 알려준다.

 

하지만 이 방법은 실무에서 잘 사용하지 않는다. 알아는 둘 것!!!