Примеры привязки параметров 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 можно повторно использовать (если изменяются только параметры связывания) для повышения производительности.