2017-06-05 10 views
0

Ich versuche, mehrere Werte in einer SELECT-Abfrage, bestehend aus zwei IN-Klauseln übergeben. Ich möchte die folgende Abfrage ausführen:Übergeben Sie mehrere Werte dynamisch Abfrage in Java

String sql = "select ADDRESS from CDR where APARTY in(?,?,?) intersect select ADDRESS from CDR where BPARTY in (?,?) and USAGETYPE='SMSMT'"; 

Wie kann ich passieren Wert mit preparedStatement.setString() .Thanks im Voraus?.

Antwort

0

Hier ist, wie Sie es tun:

PreparedStatement pstmt = yourconnexiontoDB.prepareStatement(sql); 
pstmt.setString(1, "your first string"); 
pstmt.setString(2, "your second string"); 

etc ... für den Rest der Werte.

1

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 
} 
+0

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

+0

danke @davidxxx Ich weiß es zu schätzen, ich mache es schon mit Ihrem Vorschlag, was dachten Sie? –

+1

Gern geschehen :) Wirklich viel klar jetzt. – davidxxx

Verwandte Themen