このドキュメントを見て少し驚いています。確かに、次のように配列/コレクションを設定することはできません(これは、使用するデータベース/ JDBCドライバーに関係ありません):
String sql = "SELECT col FROM tbl WHERE id IN (?)";
statement = connection.prepareStatement(sql);
statement.setArray(1, arrayOfValues); // Fail.
しかし、言及されたドキュメントのクエリは機能するはずです。これは、少なくともOracle10gXEとojdbc14.jar
を組み合わせた経験からわかります。 。ドキュメントの作成者が混乱しているか、実際には別の(古い?)バージョンのDBやJDBCドライバーに関係しているのではないかと思います。
以下は、使用されるJDBCドライバーに関係なく機能するはずです(IN句に含めることができるアイテムの数を使用するDBに依存しますが、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()
を使用してください 。