반응형
본 내용은 온라인 강의 사이트 인프런의 김영한 님의 강의 내용이 포함되어 있습니다.
'자바 ORM 표준 JPA 프로그래밍 - 기본편'
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 쿼리의 장점을 모두 가지고 있다.
반응형
'프레임워크(Framework) > JPA' 카테고리의 다른 글
[JPA] QueryDSL 소개 및 장점 (2) | 2023.01.08 |
---|---|
[JPA] JPQL 벌크 연산 - 객체지향 쿼리 언어 JPQL (12) (0) | 2022.12.24 |
[JPA] JPQL 엔티티 직접 사용 - 객체지향 쿼리 언어 JPQL (10) (0) | 2022.12.22 |
[JPA] JPQL - 다형성 쿼리 - 객체지향 쿼리 언어 JPQL (9) (0) | 2022.12.21 |
[JPA] JPQL 페치 조인(Fetch join) - 객체지향 쿼리 언어 JPQL (8) (0) | 2022.12.20 |