[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);
}
위처럼 변경해주면 된다.
'코딩 > Spring' 카테고리의 다른 글
필드주입과 생성자주입의 차이, 장단점(생성자 주입 vs 필드 주입) (0) | 2022.05.05 |
---|---|
[SpringSecurity] JWT 구현 시 javax/xml/bind/DatatypeConverter (0) | 2022.01.13 |
[Spring] 서비스 기동 시키는 방법 3가지 (0) | 2021.10.01 |
[Spring] Jpa Repository 사용하기 (0) | 2021.09.15 |
[Spring] Mybastis 연결 시 java.lang.IllegalArgumentException 에러 (0) | 2020.03.16 |