JPA/JPQL

[JPA] Named 쿼리

IT록흐 2023. 6. 19. 13:33
반응형

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로 등록되고 사용된다. 

 

 


 

 

참고자료

 

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

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

www.inflearn.com

 

반응형