Перейти к основному содержимому

Ошибка гибернации «Установлены не все именованные параметры»

· 2 мин. чтения

1. Введение

При работе с Hibernate мы можем использовать именованные параметры для безопасной передачи данных в SQL-запрос. Мы присваиваем значения параметрам запроса во время выполнения, чтобы сделать их динамическими. Что еще более важно, это помогает предотвратить атаки путем внедрения кода SQL.

Однако мы можем столкнуться с ошибками при работе с именованными параметрами. Двумя наиболее распространенными из автономной библиотеки Hibernate и реализации Hibernate JPA, соответственно, являются:

  • Не все именованные параметры установлены
  • Именованный параметр не привязан

Хотя сообщения об ошибках могут различаться между vanilla Hibernate и его реализацией JPA, основная причина одна и та же.

В этом уроке мы рассмотрим, что вызывает эти ошибки и как их избежать . Попутно мы покажем, как использовать именованные параметры с автономной библиотекой Hibernate.

2. Что вызывает ошибку

При работе с именованными параметрами в Hibernate мы должны присвоить значение каждому именованному параметру перед выполнением запроса.

Давайте рассмотрим пример запроса, в котором используется именованный параметр:

Query<Event> query = session.createQuery("from Event E WHERE E.title = :eventTitle", Event.class);

В этом примере у нас есть один именованный параметр, обозначенный заполнителем :eventTitle . Hibernate ожидает, что этот параметр будет установлен до того, как мы выполним запрос.

Однако, если мы попытаемся выполнить запрос без установки значения для : eventTitle :

List<Event> listOfEvents = query.list();

Hibernate выдаст исключение org.hibernate.QueryException , когда мы его запустим, и мы получим ошибку:

Not all named parameters have been set

3. Исправление ошибки

Чтобы исправить ошибку, мы просто предоставляем значение именованного параметра перед выполнением запроса:

Query<Event> query = session.createQuery("from Event E WHERE E.title = :eventTitle", Event.class);
query.setParameter("eventTitle", "Event 1");

assertEquals(1, query.list().size());

Используя метод setParameter (String, String) объекта запроса , мы сообщаем Hibernate, какое значение мы хотим использовать для именованного параметра.

4. Вывод

В этой статье мы рассмотрели именованные параметры и то, как они используются в Hibernate. Мы также показали, как исправить одну из ошибок именованного запроса, с которой мы можем столкнуться.

Как обычно, все образцы кода доступны на GitHub .