Post

[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.