多くのプログラミング言語では、準備されたステートメントに対して次のようなことが可能です。
PreparedStatement statement = connection.prepareStatement(
"SELECT id FROM Company WHERE name LIKE ${name}");
statement.setString("name", "IBM");
ただし、Java.sql.PreparedStatementでは使用できません。 Javaでは、パラメータインデックスを使用する必要があります。
PreparedStatement statement = connection.prepareStatement(
"SELECT id FROM Company WHERE name LIKE ?");
statement.setString(1, "IBM");
最初の例のように文字列変数を処理する解決策はありますか? 「$ {。*}」はSQL言語の他の場所で使用されていませんか、それとも競合がありますか?原因は自分で実装することです(SQL文字列を解析し、すべての変数を "?"に置き換えてからJava方法)を実行します)。
よろしく、カイ
Kd304が私の投稿へのコメントで述べたように、プロジェクトに別のサードパーティライブラリ(Springなど)を組み込みたくない場合、これは非常に良い解決策です。 Javaworld記事:PreparedStatementの名前付きパラメーター
標準JDBC PreparedStatementsにはこの機能はありません。 Spring JDBCは NamedParameterJdbcTemplate
を通じてこの機能を提供します。
あなたが言うように、生のPreparedStatementを使用すると、これは不可能です。 CallableStatementでも可能ですが、SQLステートメントだけでなく、ストアドプロシージャが必要です。
HibernateのようなORMレイヤーは名前付きパラメーターの置換も提供し、HibernateはORマッピング機能を完全にバイパスしてネイティブSQLを実行することもできます。
したがって、名前付きパラメーターを使用したい場合は、これを行う方法としてHibernateを使用できます。その機能のごく一部しか使用しません。