修正 Hibernate QueryParameterException:序數參數無參數
1. 概述
在這個簡短的教學中,我們將學習如何修復 Hibernate QueryParameterException: “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;
// standard getters and setters
}
在此範例中,員工由其標識符、名字和姓氏定義。
@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 拋出了異常 因為我們沒有使用setParameter()
來設定lastName
參數的值。
4. 修復異常
在我們的例子中,解決QueryParameterException
最簡單的解決方案是在執行查詢之前為第二個參數指定一個有效值。因此,讓我們新增一個新的測試案例並使用setParameter()
來設定姓氏:
@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 上取得。