Eine Analyse der verschiedenen verfügbaren Optionen sowie der Vor- und Nachteile jeder Option ist verfügbar aquí .
Die vorgeschlagenen Optionen sind:
- Vorbereiten
SELECT my_column FROM my_table WHERE search_column = ?
auszuführen und die Ergebnisse clientseitig zu UNION zu vereinen. Erfordert nur eine vorbereitete Anweisung. Langsam und mühsam.
- Vorbereiten
SELECT my_column FROM my_table WHERE search_column IN (?,?,?)
und führen sie aus. Erfordert eine vorbereitete Anweisung pro Größe der IN-Liste. Schnell und offensichtlich.
- Vorbereiten
SELECT my_column FROM my_table WHERE search_column = ? ; SELECT my_column FROM my_table WHERE search_column = ? ; ...
und führen sie aus. [Oder verwenden Sie UNION ALL
anstelle dieser Semikolons. --ed] Erfordert eine vorbereitete Anweisung pro size-of-IN-list. Dumm und langsam, schlechter als WHERE search_column IN (?,?,?)
Ich weiß also nicht, warum der Blogger dies überhaupt vorgeschlagen hat.
- Verwenden Sie eine gespeicherte Prozedur, um die Ergebnismenge zu erstellen.
- Bereiten Sie N verschiedene Abfragen zur Größe einer IN-Liste vor, z. B. mit 2, 10 und 50 Werten. Um nach einer IN-Liste mit 6 verschiedenen Werten zu suchen, füllen Sie die Größe-10-Abfrage so aus, dass sie wie folgt aussieht
SELECT my_column FROM my_table WHERE search_column IN (1,2,3,4,5,6,6,6,6,6)
. Jeder anständige Server optimiert die doppelten Werte, bevor die Abfrage ausgeführt wird.
Keine dieser Optionen ist ideal.
Die beste Option, wenn Sie JDBC4 und einen Server verwenden, der die x = ANY(y)
ist zu verwenden PreparedStatement.setArray
comme hier beschrieben
Es scheint keine Möglichkeit zu geben, die setArray
jedoch mit IN-Listen arbeiten.
Manchmal werden SQL-Anweisungen zur Laufzeit geladen (z. B. aus einer Eigenschaftsdatei), erfordern aber eine variable Anzahl von Parametern. In solchen Fällen definieren Sie zunächst die Abfrage:
query=SELECT * FROM table t WHERE t.column IN (?)
Als nächstes laden Sie die Abfrage. Bestimmen Sie dann die Anzahl der Parameter, bevor Sie sie ausführen. Sobald die Anzahl der Parameter bekannt ist, führen Sie sie aus:
sql = any( sql, count );
Zum Beispiel:
/**
* Converts a SQL statement containing exactly one IN clause to an IN clause
* using multiple comma-delimited parameters.
*
* @param sql The SQL statement string with one IN clause.
* @param params The number of parameters the SQL statement requires.
* @return The SQL statement with (?) replaced with multiple parameter
* placeholders.
*/
public static String any(String sql, final int params) {
// Create a comma-delimited list based on the number of parameters.
final StringBuilder sb = new StringBuilder(
String.join(", ", Collections.nCopies(possibleValue.size(), "?")));
// For more than 1 parameter, replace the single parameter with
// multiple parameter placeholders.
if (sb.length() > 1) {
sql = sql.replace("(?)", "(" + sb + ")");
}
// Return the modified comma-delimited list of parameters.
return sql;
}
Für bestimmte Datenbanken, bei denen die Übergabe eines Arrays über die JDBC 4 Spezifikation nicht unterstützt wird, kann diese Methode die Umwandlung der langsamen = ?
in die schnellere IN (?)
Klauselbedingung, die dann durch den Aufruf der any
método.