私の問題の根本は、JDBCクエリを処理し、クエリ後にすべての接続を解放するメソッドがあることです。「ResultSet」が呼び出し元のメソッドに返されます。
ResultSetを呼び出し元のメソッドに単純に戻すことはできないことがわかりました。これは、ResultSetを閉じた状態で、それを使用しようとすると、AlreadyClosedエラーが発生するためです。
したがって、リソースを閉じる前に、ResultSetをループして、ArrayListに格納します。
このメソッドはクエリを処理するため、どのような種類の型が返されるのかわかりません。したがって、ArrayListはジェネリックを格納します。
これは、1つのテーブルの1つのフィールド、つまり1つのデータベースのInteger[]フィールドを除いて機能します。
そこから得られるのはJDBC4Arrayオブジェクトであり、ArrayListに格納するためにそれをInteger[]に取得するのにかなりの時間がかかります。Integer[]である必要があります。
これは私が今持っているものです...それはそれをたくさんの欲求不満のbanjaxxingの後です。
ResultSetをループしている間、接続が閉じられる前に、次のようにします。
// For every row in the ResultSet
while (rs.next()) {
// Initialize a ITILRow for this ResultSet row
ITILRow row = new ITILRow();
// For each column in this row, add that object to the ITILRow
for (int colNum=1; colNum<=numCols; colNum++) {
Object o = rs.getObject(colNum);
// JDBC4Array is a real pain in the butt
ArrayList<Integer> tmpList = new ArrayList<Integer>();
if (o != null) {
if (o.getClass().getSimpleName().endsWith("Array")) {
// At least at this time, these Arrays are all Integer[]
Array a = (Array) o;
Integer[] ints = (Integer[]) a.getArray();
for (Integer i : ints) {
tmpList.add(i);
}
o = tmpList;
}
}
row.add(o);
}
// Add the ITILRow to allRows
allRows.add(row);
}
次に、呼び出し元のメソッドで...
for (ITILRow row : allRows) {
...
ArrayList comps = (ArrayList) row.getObject(5);
Integer[] argh = (Integer[]) ((ArrayList<Integer>) comps).toArray();
...
}
そして私は得る:
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
助けていただければ幸いです。私は私の脳をこれの結び目に結びつけました。
ありがとう、