JPA-11 NamedQuery

yj k·2023년 4월 11일
0

jpa

목록 보기
13/14

동적쿼리 : 현재 우리가 사용하는 방식처럼 EntityManager가 제공하는 메소드를 이용하여 JPQL을 문자열로 런타임 시점에 동적으로 쿼리를 만드는 방식(동적으로 만들어질 쿼리를 위한 조건식이나 반복문은 자바 코드를 이용할 수 있다.)

정적쿼리 : 미리 쿼리를 정의하고 변경하지 않고 사용하는 쿼리를 말하며 미리 정의한 코드는 이름을 부여해서 사용하게된다.
이를 NamedQuery라고 한다.

  • 어노테이션 방식
  • xml 방식

쿼리가 복잡할수록 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);
	}




정적쿼리_XML 방식

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();

0개의 댓글