Spring data JPA에서 Query method를 제공해줌
메소드 이름으로 쿼리 생성 기능
원래는 직접 JPQL 쿼리를 생성해줘야했음.
public List<Member> findByUsernameAndAgeGreaterThan(String username, int age) {
return em.createQuery("select m from Member m where m.username = :username
and m.age > :age")
.setParameter("username", username)
.setParameter("age", age)
.getResultList();
}
스프링 데이터 JPA 인터페이스를 extends할 경우 -> 메소드 이름을 분석해서 JPQL을 알아서 생성해서 실행해준다.
List<Member> findByUsernameAndAgeGreaterThan(String username,int age);
조회 : find by, read by ,get by
count : count by
만약 파라미터 이름을 변경하는 경우 앱이 실행될 때 파라미터 이름에 맞춰서 변경해주지 않으면 문법 오류를 발견 할 수 있게 된다.
long countBymemberId(Long MemberId);
->countBy memberId로 할경우 현재 Member Entity에는 memberId는 없고 Id 만 존재하기 때문에 오류를 내보내면서 실행이 되지 않게 된다.
@NamedQuery(
name="Member.findByUsername",
query="select m from Member m where m.username = :username")
public class Member {
...
}
엔티티 위에 쿼리를 적는 형식 이렇게 적어놓을 경우
public List<Member> findByUsername(String username) {
return em.createQuery("Member.findByUsername", Member.class)
.setParameter("username", "회원1")
.getResultList();
}
public interface MemberRepository extends JpaRepository<Member,Long>{
@Query(name = "Member.findByUsername")
List<Member> findByUsername(@Param("username") String username);
}
@Query를 생략하고서도 가능하다.
-> JPaRepository에 적은 타입.findByUsername 명을 가지고 NamedQuery를 먼저 찾는다. -> 있으면 실행됨.
없는 경우 -> 메서드 이름으로 쿼리 생성
1 .NamedQuery
2.메서드 이름으로 쿼리 생성.
알고만 있으면 될듯하다.
Query,리포지토리 메소드에 쿼리 정리하기.
interface에 쿼리 어노테이션에다가 직접 정의가 가능하다.
@Query("select m from Member m where m.username= :username and m.age = :age")
List<Member> findUser(@Param("username")String username,@Param("age")int age);
-> Named Query때처럼 애플리케이션 실행 시점에 문법 오류를 발견 가능. -> 이름없는 Named Query
Method 이름으로 쿼리가 생성되는 것 -> 간단하게 쿼리가 작성될 때 사용하면 좋음.
좀 복잡한 정적 쿼리를 작성할 때에는 위의 것처럼 쿼리 어노테이션에다가 직접 정의를 하는게 맞다.
-> 근데 위의 경우에는 정적쿼리에서의 문제 해결 방법이다.
동적 쿼리의 경우에는 QueryDSL을 사용해서 푸는게 좋다.