프레임워크(Framework)/JPA

[JPA] JPQL Named 쿼리(정적 쿼리) - 객체지향 쿼리 언어 JPQL (11)

잇트루 2022. 12. 23. 02:39
반응형
본 내용은 온라인 강의 사이트 인프런의 김영한 님의 강의 내용이 포함되어 있습니다.
'자바 ORM 표준 JPA 프로그래밍 - 기본편'
 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

Intro

JPQL 쿼리는 크게 동적 쿼리와 정적 쿼리로 나눌 수 있다.

 

동적 쿼리

동적 쿼리는 em.createQuery(”select ..”)와 같이 JPQL을 문자로 완성해서 직접 넘기는 것을 동적 쿼리라 한다.

런타임에 특정 조건에 따라 JPQL을 동적으로 구성할 수 있다.

 

Name 쿼리(정적 쿼리)

Name 쿼리는 미리 정의한 쿼리에 이름을 부여하여 필요할 때 사용할 수 있다.

Named 쿼리는 한 번 정의하면 변경할 수 없는 정적인 쿼리이다.

 

 

Named 쿼리 - 정적 쿼리

  • Named 쿼리는 미리 정의해서 이름을 부여해두고 사용하는 JPQL이다.
    • 한 번 정의하면 변경할 수 없는 정적인 쿼리
  • @NamedQuery 어노테이션 또는 XML 문서에 정의할 수 있다.
  • 애플리케이션 로딩 시점에 초기화 후 재사용한다.
  • 애플리케이션 로딩 시점에 JPQL 문법을 검증한다.
    • JPQL 문법 오류가 있으면 애플리케이션 실행시 에러가 발생한다.

 

Named 쿼리를 어노테이션에 정의

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

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    private int age;

    ...
}

 

Named 쿼리 사용

List<Member> resultList = em.createNamedQuery("Member.findByUsername", Member.class)
        .setParameter("username", "회원1")
        .getResultList();

for (Member member : resultList) {
    System.out.println("member = " + member);
}

 

Named 쿼리 환경에 따른 설정

  • XML로 설정된 Named 쿼리가 우선권을 가진다.
  • 애플리케이션 운영 환경에 따라 다른 XML을 배포할 수 있다.

 

Spring Data JPA에서의 Named 쿼리

Spring Data JPA에서는 Named 쿼리를 인터페이스 메서드에 바로 선언할 수 있다.

public interface MemberRepository extends JpaRepository<Member, Long> {

    @Query("select m from Member m where m.emailAddress = ?1")
    Member findByEmailAddress(String emailAddress);
}
  • 간편하게 설정할 수 있으며, Named 쿼리의 장점을 모두 가지고 있다.
반응형