[DataJpa] __**@Query 어노테이션을 이용한 쿼리 정의**__

  • 개요
    • @Query
      • 스프링 데이터 JPA에서 제공하는
        • org.springframework.data.jpa.repository.Query
        • 어노테이셔느으로 레포 메서드에 직접 쿼리 정의가능
      • 이름 없는 Named 쿼리 라고 할 수 있다네요
  • JPQL 로 사용해보기
    public interface MemberRepository extends JpaRepository<Member, Long> {
        @Query("select m from Member m where m.name = :name")
        List<Member> findByName(@Param("name") String name);
    }// :name 에 ?1 <- 이런식으로 매핑을 한다면 위치기반으로 매핑이 가능합니다. 그렇게도 써보시죠..
    @Test
        void testQueryByJPQL() {
            List<Member> member = memberRepository.findByName("상준");
            System.out.println("member = " + member);
        }
    select m1_0.id,m1_0.name from member m1_0 where m1_0.name='상준';
    member = [Member(id=1, name=상준)]
  • 네이티브 SQL 쿼리 정의
    @Test
        void testQueryByNative() {
            Member member = memberRepository.findByNameNative("상준");
            System.out.println("member = " + member);
        }
    public interface MemberRepository extends JpaRepository<Member, Long> {
        
        @Query(value = "select * from member where name = ?0", nativeQuery = true)
        Member findByNameNative(String name);
    }
    • 위 처럼 책 예제와 비슷하게 수행했건만..
    Caused by: java.lang.IllegalArgumentException: Index position must be greater zero

    가 발생한다.

    인덱스 포지션이 0보다 커야한다?

    바로

    @Query(value = "select * from member where name = ?1", nativeQuery = true)
        Member findByNameNative(String name);

    이렇게 수정했더니 쿼리가 올바르게 돈다.

    data-jpa 버전이 오르면서 질의법도 변경된건가 싶다.

    @Query 를 사용하는 경우에는 쿼리에 대한 단위테스트 검증도 필요할거같기도하다..

    사람이 짠건 자바 조상님이 와도 검증은 필요하다고 본다.


Uploaded by N2T