2015-01-21 2 views
1

JPA @NamedQuery는 응용 프로그램을 배포하고 SQL을 캐시 할 때 한 번만 SQL로 변환됩니다. EntityManager.createQuery는 메서드가 호출 될 때마다 쿼리를 변환합니다.스프링 데이터 JPA @Query 동적 또는 명명 된?

@Query 주석에 정의 된 쿼리로 Spring-data-jpa가 수행하는 작업은 무엇입니까? 배포 중에 (예 : NamedQuery) SQL로 변환되었거나 매번 (동적 쿼리와 같이) 변환 되었습니까?

+0

spring-data-jpa는 JPA 구현이 아니므로 아무 것도 변환하지 않습니다. 아마도 JPA 구현을위한 로그를 보면 그 질문에 대한 답변을 얻을 수 있습니다 ... –

+0

일부 JPA 구현은 컴파일 된 쿼리 (예 : SQL)를 캐시하므로 그러한 다중 변환은 없습니다. JPA 구현이 무엇인지는 언급하지 않았습니다. –

답변

1

스프링 데이터 JPA는 @Query으로 주석 된 쿼리 메소드를 호출 할 때마다 EntityManager.createQuery(…)을 호출합니다. 그 이유는 매우 간단합니다. EntityManager에 의해 반환 된 Query 인스턴스는 스레드에 안전하지 않으며 실제로 바인딩 된 매개 변수 정보가 포함되어 있기 때문에 상태 기반입니다.

JPA 지속성 공급자의 대부분은 어쨌든 특정 종류의 텍스트 기반 쿼리 캐싱을 수행하므로 기본적으로 특정 JPQL 쿼리에 대해 한 번 실제 SQL 쿼리를 작성하고 후속 호출에서 전자 쿼리를 다시 사용합니다.

흥미로운 측면에서 2008 년에 @Query에 대한 지원을 구축하기 시작했을 때 수동으로 선언 된 쿼리를 JPA로 명명 된 쿼리로 등록하는 가능성을 살펴 보았습니다. 불행히도 JPA를 통해 프로그래밍 방식으로 명명 된 쿼리를 수동으로 등록 할 수있는 방법은 없습니다.