[JPA] NamedQuery

NamedQuery 란

Entity에 @NamedQuery 어노테이션을 통해 쿼리를 지정해 줍니다. 쉽게 말하면 미리 이름을 부여해서 재활용할 수 있는 JPQL입니다.

사용 방법

  • 도메인 클래스에 @NamedQuery 또는 @NamedNativeQuery를 정의합니다.
  • 2개 이상의 Query를 정의하려면 @NamedQueries 또는 @NamedNativeQueries를 사용하면 됩니다.
  • Primary Key 가 되는 칼럼은 @Id를 사용하여 지정합니다.
  • 테이블의 칼럼명과 도메인 클래스의 필드명이 다를 경우 @Column을 이용하여 지정할 수 있습니다.

클래스 생성

위의 설명의 어노테이션을 사용하여 도메인 클래스를 생성합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Entity
@NamedQueries({
@NamedQuery(name = "Team.query1", query = "select t.id from Team t where t.name = 'test1'"),
@NamedQuery(name = "Team.query2", query = "select t.name from Team t where t.name = ?1"),
})
@NamedNativeQueries({
@NamedNativeQuery(name = "Team.nativeQuery1", query = "select t.id from tb_team t where t.name = 'test1'"),
@NamedNativeQuery(name = "Team.nativeQuery2", resultClass = Team.class, query = "select * from tb_team t where t.name = '?1")
})
@Table(name = "tb_team")
public class Team {
@Id
private int id;

@Column(name = "name", nullable = false)
private String name;

private int rating;
}

Repository 생성

  • Repository 인터페이스에 직접 @Query를 이용하여 SQL문을 사용할 수 있습니다.
  • nativeQuery를 사용하려면 해당 필드를 true로 설정하면 됩니다.
  • @Param을 사용하여 Query문의 파라미터와 연결할 수 있습니다.
  • entityName을 사용하면 도메인 타입이 자동으로 설정됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public interface TeamRepository extends JpaRepository<Team, Integer> {

@Query(value = "select * from tb_team t where t.name = 'test1'", nativeQuery = true)
List<Team> testNativeQuery();

@Query(value = "select t.id from #{#entityName} t where t.name like :name%", nativeQuery = true)
List<String> testNativeQuery(@Param("name") String name);

List<Integer> query1();

List<String> query2(String name);

List<Integer> nativeQuery1();

List<Team> nativeQuery2(String name);
}

위와 같이 클래스에 Native 쿼리문을 작성하고 사용할 수 있습니다.

Share