[Spring Data JPA] 네임드 쿼리
네임드 쿼리
네임드 쿼리?
→ 네임드 쿼리란 엔티티에서 미리 정한 쿼리문을 저장했다가 레포지토리에서 그것을 바로 쓸 수 있도록 이름을 지정하여 쿼리문을 저장하는 기능이다.
JPA vs Spring data JPA
Member.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
@NamedQuery(
name ="Member.findByUsername",
query = "select m from Member m where m.username = :username"
)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "MEMBER_ID")
private Long id;
private String username;
private int age;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TEAM_ID")
private Team team;
public Member(String username) {
this.username = username;
}
public Member(String username, int age, Team team) {
this.username = username;
this.age = age;
this.team = team;
}
public Member(String username, int age) {
this.username = username;
this.age = age;
}
public void changeTeam(Team team){
this.team = team;
team.getMembers().add(this);
}
}
→ 미리 @NamedQuery 어노테이션을 통해서 쿼리문을 만들어놓는다.
JPA
MemberJpaRepository.java
1
2
3
4
5
public List<Member> findByUsername(String username){
return em.createNamedQuery("Member.findByUsername", Member.class)
.setParameter("username", username)
.getResultList();
}
MemberJpaRepositoryTest.java
1
2
3
4
5
6
7
8
9
10
11
12
@Test
public void testNamedQuery(){
Member m1 = new Member("AAA", 10);
Member m2 = new Member("BBB", 20);
memberJpaRepository.save(m1);
memberJpaRepository.save(m2);
List<Member> result = memberJpaRepository.findByUsername(m2.getUsername());
Member findMember = result.get(0);
assertThat(findMember).isEqualTo(m2);
}
→ createNamedQuery라는 메소드를 사용하여 미리 이름으로써 저장한 쿼리문을 가져와서 작동시킨다.
Spring Data JPA
MemberRepository.java
1
2
@Query(name = "Member.findByUsername")
List<Member> findByUsername(@Param("username") String username);
MemberRepositoryTest.java
1
2
3
4
5
6
7
8
9
10
11
12
@Test
public void testNamedQuery(){
Member m1 = new Member("AAA", 10);
Member m2 = new Member("BBB", 20);
memberRepository.save(m1);
memberRepository.save(m2);
List<Member> result = memberRepository.findByUsername(m2.getUsername());
Member findMember = result.get(0);
assertThat(findMember).isEqualTo(m2);
}
→ 레포지토리에서 @Query라는 어노테이션을 통해서 저장한 이름의 쿼리문을 꺼내온다. 그리고 @Param 어노테이션으로 동적으로 파라미터를 설정한다.
This post is licensed under CC BY 4.0 by the author.
Comments powered by Disqus.