Fixing Hibernate QueryParameterException: No Argument for Ordinal Parameter

1. 개요

이 짧은 튜토리얼에서는 HibernateQueryParameterException: “no argument for ordinal parameter”를 해결하는 방법을 배울 것입니다.

먼저, 예외의 근본 원인을 이해할 것입니다. 다음으로는 이를 재현하는 방법을 설명하고, 마지막으로 해결 방법을 배울 것입니다.

2. 예외 이해하기

해결책으로 넘어가기 전에, 예외와 그 스택 트레이스를 이해할 시간을 가지겠습니다.

일반적으로 Hibernate는 쿼리 매개변수에 문제가 있음을 알리기 위해 QueryParameterException을 던집니다. 이는 지정된 매개변수가 유효하지 않거나 찾을 수 없음을 나타냅니다.

또한, 메시지 “no argument for ordinal parameter”는 Hibernate가 정의된 매개변수에 적합한 인수를 찾지 못했음을 나타냅니다. 이 예외의 일반적인 원인은 Hibernate 쿼리에서 정의된 매개변수에 값을 제공하지 않는 것입니다.

3. 실습 예제

Hibernate가 QueryParameterException으로 실패하는 원인을 알았으니, 이제 실습 예제를 통해 이를 어떻게 재현할 수 있는지 살펴보겠습니다.

우선, Employee 엔티티 클래스를 살펴보겠습니다:

@Entity
public class Employee {
    @Id
    private int id;
    private String firstName;
    private String lastName;

    // 표준 getter 및 setter
}

이 예제에서 직원은 식별자, 이름, 성으로 정의됩니다.

@Entity 어노테이션은 Employee 클래스가 JPA 엔티티임을 지정하고, @Id 어노테이션은 기본 키를 나타내는 필드를 표시합니다.

다음으로, 두 개의 매개변수를 가진 HQL 쿼리를 생성하고, 두 번째 매개변수의 값을 지정하지 않는 경우를 가정해 보겠습니다:

@Test
void whenMissingParameter_thenThrowQueryParameterException() {
    assertThatThrownBy(() -> {
       String selectQuery = """
           FROM Employee 
           WHERE firstName = ?1 
           AND lastName = ?2
        """;
        Query<Employee> query = session.createQuery(selectQuery, Employee.class);
        query.setParameter(1, "Jean");

        query.list();
    }).isInstanceOf(QueryParameterException.class)
      .hasMessageContaining("No argument for ordinal parameter");
}

보시다시피, Hibernate는 lastName 매개변수에 대한 값을 설정하는 setParameter()를 사용하지 않았기 때문에 예외를 던집니다.

4. 예외 수정하기

우리의 경우 QueryParameterException을 해결하는 가장 쉬운 방법은 쿼리를 실행하기 전에 두 번째 매개변수에 대해 유효한 값을 지정하는 것입니다. 그러므로, 새 테스트 케이스를 추가하고 setParameter()를 사용하여 last name을 설정하겠습니다:

@Test
void whenDefiningAllParameters_thenCorrect() {
   String selectQuery = """
       FROM Employee 
       WHERE firstName = ?1 
       AND lastName = ?2
    """;
    Query<Employee> query = session.createQuery(selectQuery, Employee.class);
    query.setParameter(1, "Jean")
      .setParameter(2, "Smith");

    assertThat(query.list()).isNotNull();
}

놀랍지 않게도, 이 테스트 케이스는 성공적으로 실행되고 QueryParameterException으로 실패하지 않습니다.

5. 결론

이 짧은 기사에서는 Hibernate가 QueryParameterException: “no argument for ordinal parameter”로 실패하는 원인을 살펴보았습니다. 그 과정에서 예외를 재현하는 방법과 이를 해결하는 방법을 보여주었습니다.

항상 그렇듯이, 예제의 전체 소스 코드는 GitHub에서 확인할 수 있습니다.

원본 출처

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다