[Spring] Could not locate ordinal parameter [1], expecting one of [] 문제

    [Spring] Could not locate ordinal parameter [1], expecting one of [] 문제

    java.lang.IllegalArgumentException: Could not locate ordinal parameter [1], expecting one of []
    	at org.hibernate.query.internal.ParameterMetadataImpl.getOrdinalParameterDescriptor(ParameterMetadataImpl.java:154) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]
    	at org.hibernate.query.internal.ParameterMetadataImpl.getQueryParameter(ParameterMetadataImpl.java:204) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]
    	at org.hibernate.query.internal.QueryParameterBindingsImpl.getBinding(QueryParameterBindingsImpl.java:183) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]
    	at org.hibernate.query.internal.AbstractProducedQuery.setParameter(AbstractProducedQuery.java:512) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]
    	at org.hibernate.query.internal.AbstractProducedQuery.setParameter(AbstractProducedQuery.java:115) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]
    	at org.springframework.data.jpa.repository.query.QueryParameterSetter$BindableQuery.setParameter(QueryParameterSetter.java:335) ~[spring-data-jpa-2.5.4.jar:2.5.4]
    	at org.springframework.data.jpa.repository.query.QueryParameterSetter$NamedOrIndexedQueryParameterSetter.lambda$setParameter$5(QueryParameterSetter.java:128) ~[spring-data-jpa-2.5.4.jar:2.5.4]
    	at org.springframework.data.jpa.repository.query.QueryParameterSetter$ErrorHandling$1.execute(QueryParameterSetter.java:141) ~[spring-data-jpa-2.5.4.jar:2.5.4]
    	at org.springframework.data.jpa.repository.query.QueryParameterSetter$NamedOrIndexedQueryParameterSetter.setParameter(QueryParameterSetter.java:128) ~[spring-data-jpa-2.5.4.jar:2.5.4]
    	at org.springframework.data.jpa.repository.query.ParameterBinder.bind(ParameterBinder.java:82) ~[spring-data-jpa-2.5.4.jar:2.5.4]
    	at org.springframework.data.jpa.repository.query.ParameterBinder.bind(ParameterBinder.java:74) ~[spring-data-jpa-2.5.4.jar:2.5.4]
    	at org.springframework.data.jpa.repository.query.ParameterBinder.bindAndPrepare(ParameterBinder.java:95) ~[spring-data-jpa-2.5.4.jar:2.5.4]
    	at org.springframework.data.jpa.repository.query.NamedQuery.doCreateQuery(NamedQuery.java:174) ~[spring-data-jpa-2.5.4.jar:2.5.4]
    	at org.springframework.data.jpa.repository.query.AbstractJpaQuery.createQuery(AbstractJpaQuery.java:227) ~[spring-data-jpa-2.5.4.jar:2.5.4]
    	at org.springframework.data.jpa.repository.query.JpaQueryExecution$CollectionExecution.doExecute(JpaQueryExecution.java:126) ~[spring-data-jpa-2.5.4.jar:2.5.4]
    	at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:88) ~[spring-data-jpa-2.5.4.jar:2.5.4]
    	at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:155) ~[spring-data-jpa-2.5.4.jar:2.5.4]
    	at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:143) ~[spring-data-jpa-2.5.4.jar:2.5.4]

    Spring Data Jpa를 활용해 api를 구현하다가 위와 같은 에러가 발생하였다.

    원인은 Spring Data Jpa에서 NamedQuery를 사용할때 발생하였다.

    @NamedQuery(name="Survey.findByPoster_id", query="select s from Survey s where s.poster_id=:poster_id")
    
    public interface SurveyRepository extends JpaRepository <Survey, Long> {
    	List<Survey> findByPoster_id(Long poster_id);
        }

    poster_id에 @Param 어노테이션을 사용하지 않았기 때문에 발생하였다.

    NamedQuery를 사용하지 않고 Spring Data Jpa의 쿼리 자동 생성을 사용할때는 문제가 되지 않지만 

    @Query 어노테이션을 활용해 NamedQuery를 사용할 때

    반드시 @Param을 통해 인자를 전달해 주어야 한다.

     

    @NamedQuery(name="Survey.findByPoster_id", query="select s from Survey s where s.poster_id=:poster_id")
    
    public interface SurveyRepository extends JpaRepository <Survey, Long> {
    	List<Survey> findByPoster_id(@Param("poster_id") Long poster_id);
        }

    위처럼 변경해주면 된다.

    댓글

    Designed by JB FACTORY