Примеры привязки параметров Hibernate

Примеры привязки параметров Hibernate

Без привязки параметра необходимо объединить параметр String следующим образом (неверный код):

String hql = "from Stock s where s.stockCode = '" + stockCode + "'";
List result = session.createQuery(hql).list();

Передача непроверенного значения из пользовательского ввода в базу данных вызовет проблемы с безопасностью, потому что это может легко получить взлом через SQL-инъекцию. Вы должны избегать вышеуказанного плохого кода и использовать привязку параметров вместо этого.

Привязка параметра гибернации

Существует два способа привязки параметров: именованные параметры или позиционные.

1. Именованные параметры

Это наиболее распространенный и удобный способ. Он использует двоеточие, за которым следует имя параметра (: пример), чтобы определить именованный параметр. Смотрите примеры ...

Пример 1 - setParameter

setParameter достаточно умен, чтобы определить тип данных параметра за вас.

String hql = "from Stock s where s.stockCode = :stockCode";
List result = session.createQuery(hql)
.setParameter("stockCode", "7277")
.list();
Пример 2 - setString

Вы можете использоватьsetString, чтобы указать Hibernate, что этот тип даты параметра - String.

String hql = "from Stock s where s.stockCode = :stockCode";
List result = session.createQuery(hql)
.setString("stockCode", "7277")
.list();
Пример 3 - setProperties

Эта функция отличная! Вы можете передать объект в привязку параметра. Hibernate автоматически проверит свойства объекта и совпадет с параметром двоеточия.

Stock stock = new Stock();
stock.setStockCode("7277");
String hql = "from Stock s where s.stockCode = :stockCode";
List result = session.createQuery(hql)
.setProperties(stock)
.list();

2. Позиционные параметры

Для определения именованного параметра используется вопросительный знак (?), И вы должны установить свой параметр в соответствии с последовательностью позиций. Смотрите пример ...

String hql = "from Stock s where s.stockCode = ? and s.stockName = ?";
List result = session.createQuery(hql)
.setString(0, "7277")
.setParameter(1, "DIALOG")
.list();

Этот подход не поддерживает функциюsetProperties. Кроме того, он уязвим для простого взлома, поскольку каждое изменение положения параметров связывания требует изменения кода привязки параметров.

String hql = "from Stock s where s.stockName = ? and s.stockCode = ?";
List result = session.createQuery(hql)
.setParameter(0, "DIALOG")
.setString(1, "7277")
.list();

Заключение

В связывании параметров Hibernate я бы рекомендовал всегда использовать «Named parameters», так как его легче поддерживать, а скомпилированный оператор SQL можно повторно использовать (если изменяются только параметры связывания) для повышения производительности.