SpringDataJPA -Query Method

JIWOO YUN·2023년 10월 12일
0

SpringDataJPA

목록 보기
1/4
post-custom-banner

쿼리 메소드 기능

  • Spring data JPA에서 Query method를 제공해줌

    1. 메소드 이름으로 쿼리 생성 기능

      • 원래는 직접 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 만 존재하기 때문에 오류를 내보내면서 실행이 되지 않게 된다.


Named Query - 실무에서는 거의 사용되지 않음.

@NamedQuery(
        name="Member.findByUsername",
        query="select m from Member m where m.username = :username")
public class Member {
    ...
}

엔티티 위에 쿼리를 적는 형식 이렇게 적어놓을 경우

  1. JPA를 직접 사용해서 Named 쿼리 호출
    public List<Member> findByUsername(String username) {
        return em.createQuery("Member.findByUsername", Member.class)
                .setParameter("username", "회원1")
                .getResultList();
    }
  1. 스프링 데이터 JPA로 NamedQuery 사용
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.메서드 이름으로 쿼리 생성.

가장 큰 장점

  • NamedQuery안에 오타를 적었을 경우 -> 애플리케이션 로딩시점에 파싱을 해서 오류가 생기면 오류를 알려주고 실행이 되지 않는다.
    • 정적쿼리기 때문에 실행때 파싱을 함.

알고만 있으면 될듯하다.


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을 사용해서 푸는게 좋다.

profile
열심히하자
post-custom-banner

0개의 댓글