1

IN 条件を含む SQL クエリを動的に作成する必要があります。したがって、文字列のリストがあり、それらをコンマでStringBuilder区切って挿入する必要があります。

そこで私の最初のアイデアは、ブール値を使用してコマを挿入するかどうかを決定することでした。

builder.append("TABLE.METACODES in (");
boolean isFirst = true;
for(String metaCode : cto.getEntityMetaCodes()) {
    if(isFirst) {
        isFirst = false;
        builder.append("'" + metaCode + "'");
    } else {
         builder.append(", '" + metaCode + "'");
    }
 }
 builder.append(")");

もっと良い解決策を考えられますか?

4

3 に答える 3

4

StringUtilsjoinから使用できます。これにより、最後のコンマが出力され、必要な結果が得られます。

ドキュメントから:

指定された配列の要素を、指定された要素のリストを含む単一の文字列に結合します。

リストの前後に区切り文字は追加されません。null セパレーターは、空の文字列 ("") と同じです。配列内の null オブジェクトまたは空の文字列は、空の文字列で表されます。

 StringUtils.join(null, *)                = null
 StringUtils.join([], *)                  = ""
 StringUtils.join([null], *)              = ""
 StringUtils.join(["a", "b", "c"], "--")  = "a--b--c"
 StringUtils.join(["a", "b", "c"], null)  = "abc"
 StringUtils.join(["a", "b", "c"], "")    = "abc"
 StringUtils.join([null, "", "a"], ',')   = ",,a"

同じアプローチを使用できます。

builder.append("TABLE.METACODES in ('");
boolean isFirst = true;
StringUtils.join(cto.getEntityMetaCodes(),"','");
builder.append("')");

このアプローチでは結果が有効な sql:TABLE.METACODES in ('')になり、コードが無効になるため、コレクションが空の場合は注意が必要です。TABLE.METACODES in ()

于 2012-07-17T08:03:45.790 に答える
2

I need to dynamically build SQL query which contatins the IN condition..いいえ、いいえ、あなたは本当にしません。本当に、それは非常に多くのレベルで恐ろしいことです。最近では、SQL クエリの文字列を操作する理由はありません。SQL インジェクションのエクスプロイトを常に取得した場合にのみ、技術プレスに掲載されます。

Hibernate はコレクションを使ってこれを簡単に行うことができます。こちらを参照してください。通常の PreparedStatements でも同様にできることを願っていますが、in 句を手動で作成し、後でループ内の変数を設定する必要がある可能性があります。フランシスコのアプローチですが、代わりにプレースホルダーを使用してください。

于 2012-07-17T08:06:49.930 に答える
1

外部ライブラリを使用せずに、次のようにします。

builder.append("TABLE.METACODES in (");
EntityMetaCodes emc = cto.getEntityMetaCodes();
builder.append("'" + emc.remove(0) + "'"); // assuming it's an ArrayList, remove(0) takes out the
                               // first element and moves everything else to the left
for(String metaCode : emc) {
    builder.append(", '" + metaCode + "'");
}
builder.append(")");
于 2012-07-17T08:23:25.800 に答える