2009-07-08 6 views
32

を用意しました。 Javaでは、パラメータインデックスを使用する必要があります。はこのようなものが準備された文のために可能である多くのプログラミング言語では文の

PreparedStatement statement = connection.prepareStatement(
    "SELECT id FROM Company WHERE name LIKE ?"); 
statement.setString(1, "IBM"); 

最初の例のように文字列変数を処理するソリューションはありますか? "$ {。*}"はSQL言語の他の場所で使用されていないか、または競合がありますか?私は自分でSQLの文字列を解析し、すべての変数を "?"で置き換えてからJavaのやり方で実装します。

よろしく、 甲斐

+4

それはあまりにも私を困惑。 http://www.javaworld.com/javaworld/jw-04-2007/jw-04-jdbc.htmlには何度か使ったことがあります。 – akarnokd

+0

こんにちはkd304、なぜあなたはコメントを使用する代わりにあなたのメッセージを答えとして残さなかったのだろうか。私はその問題を解決する方法だと思います。 – Zardoz

+0

@tokel:あなたの質問が理論的であるかどうかはわかりませんでした。私のコメントはあなたの入力された質問に本当に答えるものではありません。 – akarnokd

答えて

5

生PreparedStatementを使用して、あなたが言うように、これは、不可能です。 CallableStatementでは可能ですが、これにはSQLステートメントだけでなくストアドプロシージャが必要です。

HibernateのようなORMレイヤーも名前付きのパラメータ置換を提供し、HibernateではORマッピング機能を完全にバイパスしてネイティブSQLを実行することもできます。

名前付きパラメータを本当に使用したい場合は、これを行う方法としてHibernateを使用できます。あなたはその機能のごく一部しか使用していません。

+0

私の考えを忘れて、@ lazはもっと良いものを持っています。 – skaffman

+0

Oracle JDBCドライバは、プロシージャだけでなく、CallableStatementを使用するときに、名前付きパラメータを使用して通常のSQL文をコールすることをサポートしていると思います。 PostgreSQLは「まだ実装されていません」(postgresql-9.1-901.jdbc4.jar) – Oliv

+0

DBMSがこれをサポートしているので、少なくともSQLサーバは で、JSBC intrnalyは次のような名前付きパラメータを作成します。 '@ P0 nvarchar 4000)、@ P1 varchar(8000)、@ P2 nvarchar(4000)、@ P3 smallint、@ P4 nvarchar(4000)、@ P5 int' –

26

標準のJDBC PreparedStatementにはこの機能がありません。 Spring JDBCはNamedParameterJdbcTemplateを通してこの機能を提供します。私の投稿にコメントで述べたkd304よう

+0

非常に良い解決に感謝します。私にとっての問題は、それが別のオープンソースフレームワークの一部になるということであり、そこに多くのコードをインポートしたくないということです。さもなければ私はあなたのソリューションを使いました:-) – Zardoz

関連する問題