공부/JPA

JPA 객체지향 쿼리 언어(JPQL) - Named 쿼리

데부한 2022. 7. 23. 23:10
반응형

출처 : 자바 ORM 표준 JPA 프로그래밍 인프런 강의

 

JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다.

 

Named 쿼리

정적 쿼리

  • 미리 정의해서 이름을 부여해두고 사용하는 JPQL
  • 정적 쿼리만 가능함
  • 애노테이션, XML에 정의
  • 애플리케이션 로딩 시점에 초기화 후 재사용
  • 애플리케이션 로딩 시점에 쿼리를 검증

   

 

애노테이션

Member 클래스에 @NamedQuery 애노테이션을 추가해준다. name의 경우 Member를 붙여도 되고 안 붙여도 되지만 관례는 붙이는 것이므로 큰 이유가 없는 이상 붙이는 게 좋다. 

@NamedQuery(
        name = "Member.findByUsername",
        query = "select m from Member m where m.username = :username"
)
public class Member {

실행클래스에서 NamedQuery를 호출하고, 파라미터를 세팅하자.

List<Member> resultList = em.createNamedQuery("Member.findByUsername", Member.class)
        .setParameter("username", "member1")
        .getResultList();

for (Member member1 : resultList) {
    System.out.println("member1 = " + member1);
}
Hibernate: 
    /* Member.findByUsername */ select
        member0_.id as id1_0_,
        member0_.age as age2_0_,
        member0_.TEAM_ID as TEAM_ID5_0_,
        member0_.type as type3_0_,
        member0_.username as username4_0_ 
    from
        Member member0_ 
    where
        member0_.username=?
member1 = Member{id=3, username='회원1', age=0}

 

개발할 때 개발자에게 가장 도움?이 되는 오류는 컴파일 시 나는 오류이다. 왜냐면 거의 바로 잡을 수 있기 때문이다.  Named 애노테이션은 애플리케이션 로딩 시점에서 쿼리를 SQL로 파싱하기 때문에 만약 쿼리문에 오타가 있고, SQL 문법과 맞지 않는다면 컴파일 오류가 발생한다.

@NamedQuery(
        name = "Member.findByUsername",
        query = "select m from Membersd m where m.username = :username" // Membersd 오타
)

 

 

XML 정의

  • persistence.xml
<persistence-unit name="jpabook" >
	<mapping-file>META-INF/ormMember.xml</mapping-file>
  • ormMember.xml
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm" version="2.1">
	<named-query name="Member.findByUsername">
    	<query><![CDATA[
        	select m
            from Member m
            where m.username = :username
        ]]></query>
    </named-query>
    
    <named-query name="Member.count>
    	<query>select count(m) from Member m</query>
    </named-query>
</entity-mappings>
  • XML이 항상 우선권을 가진다.
  • 애플리케이션 운영 환경에 따라 다른 XML을 배포할 수 있다.

 

반응형