Малко съм изненадан да видя този документ. Вярно е, че не можете да зададете масив/колекция, както следва (и това е независимо от използваната база данни / JDBC драйвер):
String sql = "SELECT col FROM tbl WHERE id IN (?)";
statement = connection.prepareStatement(sql);
statement.setArray(1, arrayOfValues); // Fail.
Но заявката, спомената в документа, трябва да работи. Мога да кажа това от опит с поне Oracle 10g XE в комбинация с ojdbc14.jar
. Подозирам, че или авторът на документа е объркал нещата, или всъщност се отнася до различна (по-стара?) версия на DB и/или JDBC драйвер.
Следното трябва да работи независимо от използвания JDBC драйвер (въпреки че сте зависими от използваната DB колко елемента може да съдържа IN клаузата, Oracle (да, отново) има ограничение от около 1000 елемента):
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]);
}
}
По отношение на TIMESTAMP
въпрос, просто използвайте PreparedStatement#setTimestamp()
.