@Query로 쿼리를 작성하여 파라미터 바인딩 시 발생하는 에러 해결방법

청포도봉봉이·2023년 3월 26일
0

트러블 슈팅

목록 보기
1/2
post-thumbnail

repository

package study.querydsl.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import study.querydsl.entity.Member;

import java.util.List;

public interface MemberRepository extends JpaRepository<Member, Long> {

    @Query(value = "select * from Member where username = :username", nativeQuery = true)
    List<Member> findMemberByUsername(String username);
}
  • java 8이상부터는 @Param을 안써도 파라미터 바인딩이 된다고 알고 있는데 에러가 난다.



Test

package study.querydsl.repository;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.transaction.annotation.Transactional;
import study.querydsl.entity.Member;

import javax.persistence.EntityManager;

import java.util.List;

import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest
@Transactional
//@ActiveProfiles(value = "local")
class MemberRepositoryTest {

    @Autowired EntityManager em;
    @Autowired MemberRepository memberRepository;

    @Test
    public void test() {
        Member memberABC = new Member("memberABC", 10);
        em.persist(memberABC);

        List<Member> result = memberRepository.findMemberByUsername("member1");

        for (Member member1 : result) {
            System.out.println("member1 = " + member1);
        }
    }
}



에러 코드

org.springframework.dao.InvalidDataAccessApiUsageException: 
For queries with named parameters you need to 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 provide names for method parameters; 
Use @Param for query method parameters, or when on Java 8+ use the javac flag -parameters

  • 에러를 읽어보면 파라미터 바인딩이 필요하는 얘기를 한다.
  • java 8 이상 버전으로 프로젝트를 세팅하던가, @Param을 써서 파라미터에 대한 매핑을 해주라고 나온다.



자바 버전

  • 프로젝트와 내 노트북의 자바 버전은 11인데 에러가 난다.. 왜 일까?



해결 방법 - IntelliJ setting

  • Build and run using이 Run tests using이 IntelliJ IDEA로 되어있을 가능성이 높다.

이 세팅을 IntelliJ로 한 이유는 gradle로 설정하면 스프링 부트 구동시간이 오래걸려서였다.
하지만 gradle에서 설정한 자바버전은 11인데 IntelliJ에서 빌드를 할땐 8아래 버전이기 때문에 에러가 난다.

따라서 Build and run을 gradle로 바꿔주면 해결된다.

결과

  • 에러가 사라진걸 확인 할 수 있다!
profile
서버 백엔드 개발자

0개의 댓글