0

問題があります。SQL クエリを動的に作成し、ユーザー入力オプションに基づいています。したがって、ユーザーには 5 つのパラメーター (実際にはそれ以上) があり、そのうちのいくつか (必要に応じてすべて) を使用するか、何も使用しないかを選択して、クエリでそれらの値を指定できます。したがって、パラメーターが選択されているかどうか、および値が提供されているかどうかを確認して、クエリ文字列 (基本的な WHERE 条件) を作成します。しかし、今では ' のような特殊文字の問題があります。replaceAll("'", "\\") を使用することもできますが、これは非常に退屈で、preparedStatement.setString() の方がうまく機能することがわかっています。ただし、私にとっては、パラメーターが提供されているかどうか、および前のパラメーターも提供されているかどうかを再度確認する必要があります (? の毒を指定して、正しいパラメーターに接続するため)。これにより、多くの組み合わせが発生し、エレガントに見えません。

だから私の質問は - どういうわけか文字列を受け取ることができますか?または、同じ仕事をして文字列を提供する同様の関数があり、それを手動でクエリに入れることができます。

イントロが長すぎたのかもしれませんが、誰かがもっと良いアイデアを持っているかもしれないので、なぜそれが必要なのかを説明したかったのです.

4

2 に答える 2

0

できることは、パラメーターが指定されているかどうかに基づいて、基本的なパラメーター化されていない SQL クエリを作成し、準備されたステートメントを使用してパラメーターを入力することです。

次のようになります (ラフ スケッチ)。

Map<String, Object> parameterValues = /*from user*/;
List<String> parameterNames = Arrays.asList("field1", "field2", "field3");
List<Object> valueList = new ArrayList<Object>();

StringBuilder statementBuilder = new StringBuilder("select * from table where ");
for ( String parameterName : parameterNames ) {
    if ( parameterValues.containsKey(parameterName) ) {
        statementBuilder.append(parameterName + " = ? AND");
        valueList.add(parameterValues.get(parameterName));
    }
}

PreparedStatement st = conn.prepareStatement(statementBuilder.toString(), 
                       valueList);
//set each parameter here.

難しいのは最初だけです。その後、それを汎用にすることができます。とはいえ、これらすべてを抽象化するクエリビルダーがおそらくあるでしょう。私は QueryDSL を使用していますが、それには純粋な JDBC のバインディングはなく、JPA や JDO などがあります。

于 2012-01-11T04:24:24.910 に答える
0

別のフォーラムで、完全に機能する、よりシンプルでクリーンな別のアプローチが提供されました。同じ問題を抱えている他の人へのリンクを次に示し ます 。 /services/dyn_modify_where_clause.html

于 2012-01-11T13:15:56.337 に答える