인프런 커뮤니티 질문&답변

제트브레인님의 프로필 이미지

작성한 질문수

Practical Testing: 실용적인 테스트 가이드

Mockito로 Stubbing하기

6-1 @Query 부분

23.07.02 17:21 작성

·

540

·

수정됨

0

  • org.springframework.dao.InvalidDataAccessApiUsageException: 에 대해서 ...

org.springframework.dao.InvalidDataAccessApiUsageException:,For queries with named parameters you need to use provide names for method parameters.,Use @Param for query method parameters, or when on Java 8+ use the javac flag -parameters.;,nested exception is java.lang.IllegalStateException:,For queries with named parameters you need to use provide names for method parameters.,Use @Param for query method parameters, or when on Java 8+ use the javac flag -parameters.

강사님은 아래와 같이 @Param 을 붙여주지 않았는데도 에러가 안나셨는데 혹시 어떤 설정을 제가 놓친걸까요 .. ?

@Repository
public interface OrderRepository extends JpaRepository<Order, Long> {

    @Query("select o from Order o where o.registeredDateTime >= :startDateTime" +
            " and o.registeredDateTime < :endDateTime" +
            " and o.orderStatus = :orderStatus")
    List<Order> findOrdersBy(@Param("startDateTime") LocalDateTime startDateTime,
                             @Param("endDateTime") LocalDateTime endDateTime,
                             @Param("orderStatus") OrderStatus orderStatus);

}

답변 2

0

박우빈님의 프로필 이미지
박우빈
지식공유자

2023. 07. 07. 08:09

안녕하세요, FULL님! :)

당시 실행하셨던 환경을 확인해봐야 해서 정확한 답변을 드리기는 어렵지만, 아마 자바 컴파일러 차이였지 않을까 싶은데요. (컴파일러 옵션)
강의 중에 다루지는 못했지만 이런 문제 때문에 명시적으로 붙여주는 것이 좋다고 생각합니다 ㅎㅎ

관련해서 비슷한 질문/답변 첨부 드려요!
https://www.inflearn.com/questions/367372/param-%EC%83%9D%EB%9E%B5

감사합니다 :)

0

인프런 AI 인턴님의 프로필 이미지

2023. 07. 04. 17:26

안녕하세요, 인프런 AI 인턴이에요.

@Query 어노테이션을 사용하여 직접 쿼리를 작성할 때, 쿼리의 매개변수에 파라미터로 전달되는 값을 바인딩하기 위해서는 @Param 어노테이션을 사용해야 합니다.
그러나 위의 예제 코드에서 @Param 어노테이션이 붙지 않아도 동작하는 이유는 스프링 프레임워크 4.3 이후부터는 문자열로 명명된 파라미터를 지원하기 때문입니다.
따라서 @Param 어노테이션이 없어도 매개변수의 이름과 쿼리 안의 파라미터 이름이 동일하다면 자동으로 바인딩 됩니다.

하지만 이 기능을 사용하려면 자바 컴파일러에게 메서드 파라미터 이름을 유지하도록 컴파일러 옵션을 설정해야 합니다.
자바 8 이후 버전의 컴파일러는 자동으로 메서드 파라미터의 이름을 유지하도록 설정되어 있지만, 그 이전 버전의 자바 컴파일러는 이 옵션이 기본적으로 비활성화되어 있습니다.

따라서 자바 8 이전 버전을 사용하고 계신다면, 당시에는 원하는 실제 파라미터 이름을 사용하지 않았기 때문에 @Param 어노테이션을 명시적으로 추가해야 했을 가능성이 있습니다.
하지만 자바 8 이후 버전을 사용하고 있다면 @Param 어노테이션을 추가하지 않아도 동작할 수 있습니다.

현재 코드가 정상적으로 동작하고 있다면, 버전에 따른 자동 바인딩이 적용된 것이니까 따로 설정할 필요는 없습니다. 문제가 발생하지 않는다면 그대로 사용하시면 되요.

추가적인 문제가 있으시다면, 스프링 버전과 자바 컴파일러 버전에 대한 정보를 공유해주시면 더 정확한 답변을 드릴 수 있을 것 같아요.
더 궁금한 점이 있다면 언제든지 물어보세요! 수고하세요.