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.
jpql로 쿼리를 조회하고, 이를 활용해 테스트코드를 작성하는데 다음과 같은 문제를 만났다.
@Query("select m from MemberEntity m where m.nickName=:nick and m.gender=:gen")
List<MemberEntity> getMembersByNickAndGender(String nick, Gender gen);
@Test
@DisplayName('JPQL을 사용하여 닉네임이 궁예면서 성별이 남성인사람만 조회하도록 한 다.')
void getMembersByNickAndGenderTest(){
//given
String nickName= "궁예";
Gender gender = Gender.MALE;
//when
List<MemberEntity> list = memberRepository.getMembersByNickAndGender(nickName,gender);
//then
list.forEach(m -> {
System.out.println(m);
assertEquals("궁예", m.getNickName());
assertEquals(Gender.MALE, m.getGender());
});
}
```
jpql 을 작성할때
where m.nickName=?1 and m.gender=?2
로 작성했을 때 잘되었지만,
nickName=:nick and m.gender=:gen
를 사용했을 때 검색이 되지 않았다.
param 을 붙여주지 않았던 문제이거나, 자바 컴파일러 문제였습니다.
이유를 찾아보고 해결방법은 다음과 같다.
@Query("select m from MemberEntity m where m.nickName=:nick and m.gender=:gen")
List<MemberEntity> getMembersByNickAndGender(@Param("nick")String nick, @Param("gen")Gender gen);
인텔리제이를 사용한다면
컨트롤+알트+s 를 눌러 설정에 들어간 후, java컴파일러 창으로 이동한다.
추가 명령줄 매개변수에
-parameters를 입력한다.
@Param 어노테이션을 붙이지 않아도 잘 되는 것이 확인된다.