事象
Webアプリケーションのある機能で例外が発生し、ログを確認すると「Bad value for type long」と出力されている。
この機能はDB操作を伴う機能であるため、発行したSQLをデバッグしてみたところ正常に動作し、SQL自体は間違ってなさそうなことが分かっている。
解決策
DBにTimestampで定義されているカラムをUNIX秒(Long型)で取得したい場合
SQL発行後にまずはjava.sql.ResultSet.getTimestamp()
で値を取得する。
その後、java.sql.Timestamp.getTime()
を呼び出して、java.sql.Timestamp型からLong型のUNIX秒に変換することができる。
Long lUnixTime = resultSet.getTimestamp("DATETIME").getTime();
原因
アプリケーション内でDBへのSELECT文発行結果を取得する部分のコードに問題があった。
DB内にTimestamp型で格納されているカラムに対してresultSet.getLong()
してたことが原因であった。
Long lUnixTime = resultSet.getLong("DATETIME");
上記のコードでは、タイムスタンプをUNIX秒に変換して取得したかったのでgetLong()
を呼び出しているが、
この方法では例外が発生したため、実装の修正が必要であった。
ログ出力されたBad value for type long
を検索してみたところ、SQLException
によるものだということが分かった(SQLException
が握りつぶされていることも分かった)。