パラメータバインディングを使用しない場合、このようなパラメータ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文は、パフォーマンスを向上させるために再利用できます。