반응형
Named쿼리란, 쿼리에 이름을 부여한 쿼리이다.
@Entity
@NamedQueries({
@NamedQuery(name = "Person.findAll", query = "SELECT p FROM Person p"),
@NamedQuery(name = "Person.findByAge", query = "SELECT p FROM Person p WHERE p.age = :age")
})
public class Person {
@Id
private Long id;
private String name;
private int age;
}
엔티티와 관련된 NamedQuery를 사용하면 '이름'으로 편하게 JPQL을 재활용할 수 있다.
public class PersonRepository {
@PersistenceContext
private EntityManager entityManager;
public List<Person> findAll() {
TypedQuery<Person> query = entityManager.createNamedQuery("Person.findAll", Person.class);
return query.getResultList();
}
}
"Person.findAll" 이름으로 어디서든 JPQL을 불러 사용할 수 있다.
NamedQuery의 장점은 정적쿼리로 어플리케이션 로딩시점에 파싱이 이루어진다는 점이다. 컴파일 단계에서 오류가 잡히므로 NamedQuery로 등록된 JPQL은 프로그램 실행과정에서 오류를 배출할 위험이 적다. 하지만 NamedQuery는 엔티티를 지저분하고 비대하게 만든다. 그래서 실무에서는 스프링데이터JPA개념을 사용하여 구현한다.
스프링데이터JPA는 JPA를 추상화된 개념으로 사용하는 원리를 다룬다.
@Repository
public interface PersonRepository extends JpaRepository<Person, Long> {
@Query("SELECT p FROM Person p")
List<Person> findAll();
@Query("SELECT p FROM Person p WHERE p.age = :age")
List<Person> findByAge(int age);
}
스프링데이터JPA에서 @Query를 인터페이스 메소드에 등록한다. @Query는 이름없는 @NamedQuery이다. @Query로 등록된 JPQL도 NamedQuery로 등록되고 사용된다.
참고자료
반응형
'JPA > JPQL' 카테고리의 다른 글
[JPA] 벌크(Bulk) 연산 (0) | 2023.06.19 |
---|---|
[JPA] 상속관계에서 JPQL ( TYPE, TREAT ) (0) | 2023.06.16 |
[JPA] 페치 조인 ( JOIN FETCH ) (0) | 2023.06.15 |
[JPA] 묵시적 조인보다는 명시적 조인 (0) | 2023.06.15 |
[JPA] 쿼리결과 변환하기 ( JPQL 함수 ) (0) | 2023.06.14 |