Hibernateのパラメータバインディングの例

Hibernateパラメーターバインディングの例

パラメーターバインディングを使用しない場合、次のようにパラメーター文字列を連結する必要があります(不正なコード)。

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

ユーザー入力からデータベースに未チェックの値を渡すと、SQLインジェクションによって簡単にハッキングされる可能性があるため、セキュリティ上の懸念が生じます。 上記の不正なコードを回避し、代わりにパラメーターバインディングを使用する必要があります。

Hibernateパラメーターバインディング

パラメータバインディングには、名前付きパラメータと位置パラメータの2つの方法があります。

1. 名前付きパラメーター

これが最も一般的でユーザーフレンドリーな方法です。 名前付きパラメーターを定義するには、コロンの後にパラメーター名(:example)を使用します。 例を参照してください…

例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 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パラメーターバインディングでは、メンテナンスがより簡単で、コンパイルされたSQLステートメントを再利用して(バインドパラメーターのみが変更された場合)パフォーマンスを向上させることができるため、常に「Named parameters」を選択することをお勧めします。