4.1 リクエストのパラメータ
Hibernate を使用すると、パラメータをクエリに渡すことができます。したがって、すべての作業はクエリで行われ、データベースは大幅に簡素化されます。
不変のクエリが見つかることは非常にまれです。最初はデータベースから商品のリストを返すだけのようです。そして、特定の日付における特定のユーザー向けの最新の製品リストが必要であることがわかりました。必須フィールドによって並べ替えられますが、リスト全体ではなく、特定のページ (たとえば、21 から 30 までの製品) で並べ替えられます。
そして、これはまさにパラメータ化されたクエリが解決するものです。HQL でクエリを作成し、変更できる値を「特別な名前」、つまりパラメーターに置き換えます。そして、リクエストを実行するときに、これらのパラメーターの値を個別に渡すことができます。
特定の名前を持つユーザーのすべてのタスクを返す HQL クエリを作成してみましょう。
from EmployeeTask where employee.name = "Ivan Ivanovich"
次に、名前をパラメータに置き換えましょう。
from EmployeeTask where employee.name = :username
タスクを見つけるための Java コードは次のようになります。
String hql = "from EmployeeTask where employee.name = :username";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameter("username", "Ivan Ivanovich");
List<EmployeeTask> resultLIst = query.list();
また、パラメータ名の代わりに数字だけを使用することもできます。
String hql = "from EmployeeTask where employee.name = :1";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameter(1, "Ivan Ivanovich");
List<EmployeeTask> resultLIst = query.list();
もちろん、名前を使用する方が良いですが、そのようなコードは読みやすく、保守しやすいです。
4.2 setParameterList() メソッド。
パラメーター値が 1 つではなく、オブジェクトのリストを表す場合もあります。たとえば、従業員の職業が特定のリストに含まれていることを確認したいとします。
これはどのようにして行われるのでしょうか:
String hql = "from EmployeeTask where occupation IN (:occupation_list)";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameterList("occupation_list", new String[] {"Programmer", "Tester"});
List<EmployeeTask> resultLIst = query.list();
4 種類のリストをパラメータ値として渡すことができます。
- オブジェクトの配列: Object[]
- コレクション: コレクション
- 型付き配列: T[]
- 型付きコレクション: Collection<T>
型付きコレクションまたは配列を渡す場合は、データ型を 3 番目のパラメーターとして渡す必要があります。例:
String hql = "from EmployeeTask where occupation IN (:occupation_list)";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameterList("occupation_list", new String[] {"Programmer", "Tester"}, String.class);
List<EmployeeTask> resultLIst = query.list();
リスト パラメーターを操作する場合は、パラメーター名の代わりに数値を使用することもできます。しかし、繰り返しますが、名前の方が便利です。
4.3 SQL インジェクションに対する保護
パラメーターの最も重要な目的の 1 つは、SQL インジェクションからデータベースを保護することです。多くの初心者プログラマは、パラメータを使用する代わりに、単にいくつかの部分の文字列をつなぎ合わせます。
このように書く代わりに:
String hql = "from EmployeeTask where employee.name = :username";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameter("username", "Ivan Ivanovich");
List<EmployeeTask> resultLIst = query.list();
次のように書きます:
String hql = "from EmployeeTask where employee.name = " + "Ivan Ivanovich";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
List<EmployeeTask> resultLIst = query.list();
決してそんなことはしないでください!複数の部分からの SQL/HQL クエリを結合しないでください。遅かれ早かれユーザー名はクライアントから提供されるからです。そして邪悪なハッカーは次のような文字列を与えます""Ivan"; DROP TABLE user;"
そして、データベースへのクエリは次の形式になります。
from EmployeeTask where employee.name = "Ivan"; DROP TABLE user;
データが単純に削除されるだけであればまだ良いのです。次のように書くこともできます。
from EmployeeTask where employee.name = "Ivan";
UPDATE user SET password = '1' WHERE user.role = 'admin'
または次のようにします。
from EmployeeTask where employee.name = "Ivan";
UPDATE user SET role = 'admin' WHERE user.id = 123;
GO TO FULL VERSION