Hibernateのパラメータバインディングの例
パラメータバインディングを使用しない場合、このようなパラメータStringを連結する必要があります(不良コード)。
String hql = "from Stock s where s.stockCode = '" + stockCode + "'"; List result = session.createQuery(hql).list();
ユーザー入力からデータベースへのチェックされていない値を渡すと、SQLインジェクションで簡単にハックする可能性があるため、セキュリティ上の懸念が生じます。上記の悪いコードを避け、パラメータバインディングを代わりに使用する必要があります。
Hibernateパラメータバインディング
パラメータのバインドには、名前付きのパラメータまたは位置指定という2つの方法があります。
1.名前付きパラメータ
これは最も一般的でユーザーフレンドリーな方法です。コロンとそれに続くパラメータ名(:example)を使用して、名前付きパラメータを定義します。例を見る…
例1 – 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のパラメータバインディングでは、メンテナンスがより簡単であるため、常に
名前付きパラメータ
を使用することをお勧めします。コンパイルされたSQL文は、パフォーマンスを向上させるために再利用できます。