Jestem trochę zaskoczony widząc ten dokument. Prawdą jest, że nie można ustawić tablicy/kolekcji w następujący sposób (i to niezależnie od użytego sterownika bazy danych / JDBC):
String sql = "SELECT col FROM tbl WHERE id IN (?)";
statement = connection.prepareStatement(sql);
statement.setArray(1, arrayOfValues); // Fail.
Ale wspomniane w dokumencie zapytanie powinno zadziałać. Mogę to stwierdzić na podstawie doświadczenia z co najmniej Oracle 10g XE w połączeniu z ojdbc14.jar
. Podejrzewam, że albo autor dokumentu pomylił rzeczy, albo faktycznie dotyczy innej (starszej?) wersji sterownika DB i/lub JDBC.
Poniższe powinno działać niezależnie od używanego sterownika JDBC (chociaż jesteś zależny od używanej bazy danych, ile elementów może zawierać klauzula IN, Oracle (tak, znowu) ma limit około 1000 elementów):
private static final String SQL_FIND = "SELECT id, name, value FROM data WHERE id IN (%s)";
public List<Data> find(Set<Long> ids) throws SQLException {
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
List<Data> list = new ArrayList<Data>();
String sql = String.format(SQL_FIND, preparePlaceHolders(ids.size()));
try{
connection = database.getConnection();
statement = connection.prepareStatement(sql);
setValues(statement, ids.toArray());
resultSet = statement.executeQuery();
while (resultSet.next()) {
Data data = new Data();
data.setId(resultSet.getLong("id"));
data.setName(resultSet.getString("name"));
data.setValue(resultSet.getInt("value"));
list.add(data);
}
} finally {
close(connection, statement, resultSet);
}
return list;
}
public static String preparePlaceHolders(int length) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < length;) {
builder.append("?");
if (++i < length) {
builder.append(",");
}
}
return builder.toString();
}
public static void setValues(PreparedStatement preparedStatement, Object... values) throws SQLException {
for (int i = 0; i < values.length; i++) {
preparedStatement.setObject(i + 1, values[i]);
}
}
W odniesieniu do TIMESTAMP
pytanie, po prostu użyj PreparedStatement#setTimestamp()
.