2017-05-31 4 views
0

Ich habe eine Hash-Karte mit einem Schlüssel und Wert (Array von ganzen Zahlen) HashMap<key, array> und ich möchte Daten aus einer SQL-Tabelle mit einer Spalte abrufen, die die Werte in Array gespeichert ist in einem hashmapAbrufen von Daten aus einer Tabelle basierend auf Werten in einer Hash-Tabelle

Ich kann dies auf zwei Arten tun, die alle Daten aus der Tabelle und iterating durch hashmap und andere iterating durch hashmap und die Anwendung der Where-Klausel in jeder Iteration, die n Anrufe an die Datenbank macht.

Gibt es eine effiziente Möglichkeit, dies anders als oben zu tun?

+0

Ich nehme an, dass beide von ihnen ineffizient ist, sollte Ihre SQL-Abfrage in einer Datenbank abrufen abrufen. Wenn das Ergebnis für Ihren Java-Client zu groß ist, behandeln Sie es in Stapeln. – SomeDude

+0

Es hängt natürlich davon ab, wie groß die Tabelle ist und wie viele Einträge es in der Hash-Map gibt. Denken Sie darüber nach: Stellen Sie sich vor, dass es zehn Einträge in der Hash-Map und hundert Millionen Zeilen in der Tabelle gibt. Nehmen wir an, es gibt zehntausend Einträge in der Hash-Map und eine Tabelle mit sechs Zeilen. Siehst du schon, warum du keine Antworten bekommst? – Dima

Antwort

0

Verwenden Sie ein PreparedStatement eine Abfrage mit einer IN Bedingung in der WHERE Klausel einzurichten. Dieser Codeausschnitt sollte Ihnen die allgemeine Idee geben:

values = new int[]{1,2,3,4,5}; 
    String query = 
     "SELECT film_id, title\n" 
     + "FROM film\n" 
     + "WHERE film_Id IN ("; 
    for (int i = 0; i < values.length; ++i) { 
     if (i > 0) { 
      query += ","; 
     } 
     query += "?"; 
    } 
    query += ")"; 

    try { 
     Connection conn = DriverManager.getConnection("db-url", "user", "pwd"); 
     PreparedStatement stmt = conn.prepareStatement(query); 
     for (int i = 0; i < values.length; ++i) 
      stmt.setInt(i+1, values[i]); 
     ResultSet rs = stmt.executeQuery(); 
     while (rs.next()){ 
      // process results 
     } 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
+0

Sie müssen vorsichtig mit dynamischen "in" -Anweisungen sein, wenn Sie Oracle verwenden, da es ein Limit von 1000 hat. – tsolakp

Verwandte Themen