ResultSetを処理するこのJavaメソッドがあります。
protected void populateDto(String[] rowSet, ResultSet rs, String[] columunsNames) throws SQLException {
for (int i = 0; i < rowSet.length; i++) {
rowSet[i] = rs.getString(columunsNames[i]);
}
}
ご覧のとおり、すべての結果は文字列型として扱われます(getStringは列型に関係なく使用されます)。日付列が検出されると、自動的に文字列に変換されます。結果の日付は次のように表示されます。
2012-08-01 16:10:47.0
上記のスクリプトを変更して、次のようなものを作成しました。
protected void populateDto(String[] rowSet, ResultSet rs, String[] columunsNames) throws SQLException {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for (int i = 0; i < rowSet.length; i++) {
Object o = rs.getObject(columunsNames[i]);
if (o instanceof Date) {
rowSet[i] = formatter.format((Date)o);
} else {
rowSet[i] = (String)o;
}
}
}
このメソッドはすべてをオブジェクトとして扱い、その後、そのオブジェクトがDateのインスタンスであるかどうかをチェックします。これが当てはまる場合は、に従ってフォーマットされformatter
ます。問題は、このようにして返されるデータが次のようになることです。
2012-08-01 00:00:00.0
なんで?
更新1-最後に機能するメソッドの実装:
protected void populateDto(String[] rowSet, ResultSet rs, String[] columunsNames, SimpleDateFormat formatter) throws SQLException {
Timestamp ts = null;
for (int i = 0; i < rowSet.length; i++) {
Object obj = rs.getObject(columunsNames[i]);
if (obj instanceof Date) {
ts = rs.getTimestamp(columunsNames[i]);
rowSet[i] = formatter.format(ts);
} else {
if(obj!=null)
rowSet[i] = obj+"";
else
rowSet[i] = "";
}
}
}