jpql 쿼리 Param 어노테이션 문제

행행·2023년 1월 17일
0


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로 쿼리를 조회하고, 이를 활용해 테스트코드를 작성하는데 다음과 같은 문제를 만났다.


필드에서 특정 닉네임이 포함된 jpql을 작성하고 테스트를 하려고 했다.
MemberRepository에 작성된 jpql 쿼리 코드다.

@Query("select m from MemberEntity m where m.nickName=:nick and m.gender=:gen")
	List<MemberEntity> getMembersByNickAndGender(String nick, Gender gen);
    

test에 작성된 테스트 코드다.

 	@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 을 붙여주지 않았던 문제이거나, 자바 컴파일러 문제였습니다.

이유를 찾아보고 해결방법은 다음과 같다.

1.

@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);
 

2.

자바 컴파일러 설정을 바꿔준다.

인텔리제이를 사용한다면

컨트롤+알트+s 를 눌러 설정에 들어간 후, java컴파일러 창으로 이동한다.
추가 명령줄 매개변수에

-parameters를 입력한다.

@Param 어노테이션을 붙이지 않아도 잘 되는 것이 확인된다.

profile
성장하려고 분투 중인 개발자

0개의 댓글