@Entity
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString(of = {"id", "userName", "age"})
@NamedQuery(
name="Member.findByUsername",
query="select m from Member m where m.username = :username"
)
public class Member {
@Id
@GeneratedValue
@Column(name = "member_id")
private Long id;
private String username;
private int age;
엔티티에 @NamedQuery를 작성해두면
repository에서 함수를 쓰듯 가져다 쓸 수 있다.
//JPQL Repository(MemberJpaRepository)
public List<Member> findByUserName(String username) {
return em.createNamedQuery("Member.findByUsername", Member.class)
.setParameter("username", username)
.getResultList();
}
//사용코드
List<Member> result = memberJpaRepository.findByUserName("AAA");
//Spring data Repository (MemberRepository)
@Query(name = "Member.findByUsername")
List<Member> findByUsername(@Param("username") String username);
//사용코드
List<Member> result = memberRepository.findByUsername("AAA");
Spring data-JPA에서 쓸때에는
//@Query(name = "Member.findByUsername")
List<Member> findByUsername(@Param("username") String username);
Query어노테이션을 생략할 수 있다. 왜냐하면 기본값이 findByUsername의 NamedQuery를 찾고 없으면
메소드 이름으로 쿼리를 생성하기 때문이다.
✔ NamedQuery의 가장 큰 장점은 어플리케이션 빌드 시점에서 오류를 알려준다는 것이다.
일반 적인 jpql에서는 String을 넣는 것에 불과하기 때문에 오류가 나지않는데 NameQuery의 경우에는 빌드시점에서 String안에 있는 값들을 parsing해보고 그 과정에서 오류가 검출 될 수 있다.
✔ 여기서 주의할것은 Spring data Jpa에서 인터페이스로만 작성해야한다. 따라서 메소드를 작성하고 안에 query를 작성하지 못하기 때문에 NamedQuery를 쓰려한다면 이는 좋은 방법이 아니다. Spring Data Jpa 에서도 query 를 직접 작성하는 방법이 있다.
바로 @Query 어노테이션에 직접 query를 작성해 줘도 된다.
https://keyboardfoot.tistory.com/146