동적쿼리 : 현재 우리가 사용하는 방식처럼 EntityManager가 제공하는 메소드를 이용하여 JPQL을 문자열로 런타임 시점에 동적으로 쿼리를 만드는 방식(동적으로 만들어질 쿼리를 위한 조건식이나 반복문은 자바 코드를 이용할 수 있다.)
정적쿼리 : 미리 쿼리를 정의하고 변경하지 않고 사용하는 쿼리를 말하며 미리 정의한 코드는 이름을 부여해서 사용하게된다.
이를 NamedQuery
라고 한다.
쿼리가 복잡할수록 xml 방식이 선호된다.
@NamedQuery
속성
name
: 쿼리를 실행할 때 사용할 이름
query
: 쿼리 구문
참조할 클래스 영역에 붙인다.
@Entity(name="section08_menu")
@Table(name="TBL_MENU")
@NamedQueries({
@NamedQuery(name="section08_menu.selectMenuList", query="SELECT m FROM section08_menu m")
})
public class Menu {
...필드영역 생략
쿼리 실행문
name 속성에 작성한 이름(section08_menu.selectMenuList)으로 쿼리 실행
@Test
public void 어노테이션_기반_네임드쿼리를_이용한_조회_테스트() {
//when
List<Menu> menuList = entityManager.createNamedQuery("section08_menu.selectMenuList", Menu.class).getResultList();
//createNamedQuery("@NamedQuery의 name 속성에 작성한 이름", Menu.class)
//then
assertNotNull(menuList);
menuList.forEach(System.out::println);
}
persistenc.xml 파일에 코드 추가
: 쿼리를 작성한 xml을 읽어오는 코드
<mapping-file>/META-INF/menu-query.xml</mapping-file>
menuqeury.xml에서는 쿼리를 작성한다.
name
쿼리 실행 시 name 영역에 작성한 이름으로 실행 요청
(여기서는 section08_menu.selectMenuNameByCode)
<named-query name="section08_menu.selectMenuNameByCode">
<query>
SELECT
m
FROM section08_menu m
WHERE m.menuCode = :menuCode
</query>
</named-query>
쿼리 실행문
name 속성에 작성한 이름(section08_menu.selectMenuNameByCode)으로 쿼리 실행
//when
Menu foundMenu = entityManager.createNamedQuery("section08_menu.selectMenuNameByCode", Menu.class)
.setParameter("menuCode", menuCodeParameter)
.getSingleResult();