반응형
?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를 사용해서 동작하는 것이다.
반응형
'JPA' 카테고리의 다른 글
API 개발을 위한 JPA 1 - crud 메서드 작성시 유의점 (0) | 2021.06.12 |
---|---|
JPA 공부 20 - JPQL . 9 벌크 연산 (0) | 2021.06.08 |
JPA 공부 18 - JPQL . 7 페치조인 (0) | 2021.06.07 |
JPA 공부 17 - JPQL . 6 경로 표현식 (0) | 2021.06.07 |
JPA 공부 16 - JPQL . 4 JOIN (0) | 2021.06.06 |