본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


JPA

JPA 공부 19 - JPQL . 8 Named 쿼리

반응형

 

?named 쿼리

 

- 미리 정의해서 이름을 부여해두고 사용하는 JPQL 이다 

 

- 정적 쿼리만 가능하다 . 

 

- 어노테이션 xml 정의가 가능하다

 

-애플리케이션 로딩 시점에 초기화 후 재사용한다. 로딩 시점에 sql 로 만들어 놓고 캐싱한다.

 

-애플리케이션 로딩 시점에 쿼리를 검증할 수 있다.

 

 

@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@NamedQuery(
        name = "Member.findByUsername",
        query = "select m from Member m where m.username = :username"
)
public class Member {
    @Id
    @GeneratedValue
    private Long id;

    private String username;

    private int age;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "team_id")
    private Team team;

    public void addTeam(Team team){
        team.getMembers().add(this);
        this.team = team;
    }

    public Member(String username, int age) {
        this.username = username;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Member{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", age=" + age +
                ", team=" + team +
                '}';
    }
}

 

@NamedQuery를 달고 옵션으로 name은 쿼리의 이름을 지정하고 , query에는 실행될 쿼리를 지정하면 된다. 

 

사용하는 곳에서 name 으로 쿼리를 실행 할 수 있다. 

 

사용해보자

            Team team1 =  new Team("team1");
            
            //샘플 데이터
            Member member1 = new Member("user1",10);
            member1.setTeam(team1);
            
            em.persist(member1);
            
            em.flush();
            em.clear();


            Member singleResult = em.createNamedQuery("Member.findByUsername", Member.class)
                    .setParameter("username", "user1")
                    .getSingleResult();

            System.out.println("singleResult = " + singleResult);

 

em.createNamedQuery메서드가 필요하다 . 첫번째 파라미터로 엔티티에 지정해놓은 쿼리이름 , 두번째는 반환타입

 

파라미터 지정도 가능하다 동적 쿼리는 불가능하다. 

 

 

엔티티에 지정하는 것말고 따로 xml 파일을 만들어서 named 쿼리를 모아 놓을 수도 있다.  XML은 어노테이션보다 우선권을 갖는다 필요에 따라서는 운영 환경에 따라 다른 xml을 배포할 수 있다.

 

쿼리에 문제가 있을시 로딩 시점에 에러를 터뜨려 주기 때문에 오류를 잡을 수 있다 .  네임드 쿼리의 큰 장점이다 .

 

스프링 데이터 jpa 의 @Query 어노테이션도 namedquery를  사용해서 동작하는 것이다.

 

반응형