Ihre Abfrage erstellen Sie zum Beispiel StringBuilder
zum Beispiel verwenden können:
Betrachten Sie haben ein zwei Listen wie folgt aus:
List<String> values1 = new ArrayList<>();
values1.add("val1_1");
values1.add("val1_2");
values1.add("val1_3");
List<String> values2 = new ArrayList<>();
values2.add("val2_1");
values2.add("val2_2");
Jetzt werden wir die Abfrage erstellen:
StringBuilder sql = new StringBuilder("select ADDRESS from CDR where APARTY IN(");
for (int i = 0; i < values1.size(); i++) {
sql.append(i == values1.size() - 1 ? "?" : "?,");
}
sql.append(") intersect select ADDRESS from CDR where BPARTY IN (");
for (int i = 0; i < values2.size(); i++) {
sql.append(i == values2.size() - 1 ? "?" : "?,");
}
sql.append(") and USAGETYPE='SMSMT'");
System.out.println(sql);
Bis jetzt gibt Ihnen diese Dose:
select ADDRESS from CDR where APARTY IN(?,?,?) intersect select ADDRESS from CDR where BPARTY IN (?,?) and USAGETYPE='SMSMT'
Nun müssen Sie diese Abfrage in der PreparedStatement verwenden:
try (PreparedStatement pstm = connection.prepareStatement(sql)) {
int i = 1;
for (String s : values1) {
pstm.setString(i++, s);
}
for (String s : values2) {
pstm.setString(i++, s);
}
//...execute the statement and retrieve the results
}
Sehr gute Lösung, da es SQL-Injektion verhindert. Es stützt sich tatsächlich auf 'PreparedStatement.setString()' für jeden in der IN-Klausel hinzugefügten String-Wert. Als Seitenknoten denke ich, dass die Iterationen mit "i" und "j", die Sie verwenden, ein wenig kompliziert sind und einfacher sein könnten. Persönlich hätte ich eine einzelne "int" und eine "erweiterte für", um auf jeder Liste zu iterieren. – davidxxx
danke @davidxxx Ich weiß es zu schätzen, ich mache es schon mit Ihrem Vorschlag, was dachten Sie? –
Gern geschehen :) Wirklich viel klar jetzt. – davidxxx