0

日付列のあるデータベースがあり、クエリを実行すると、各行が列名から列値へのマップとして取得されます。私の問題は、一般的に日付列を取得する方法がわからないことです。

現時点では、単に文字列にキャストしてからjava.util.Dateとして解析しようとしていますが、キャスト時にこのエラーが発生します。それ以外の場合、データを取得する方法がわかりません。

このコードはSybaseおよびOracleデータベースでも機能するはずなので、一般的な答えをいただければ幸いです。

private static final String USER_QUERY = "SELECT USERNAME, PASSWORD, SUSPEND_START_DATE, SUSPEND_END_DATE FROM USERS";

public User readUsers(Subjects subjects) throws SubjectReaderException {
    /* Perform the query */
    List<User> users = new ArrayList<User>();
    List<Map<String, Object>> rows = jdbcTemplate.queryForList(USER_QUERY);
    /* Map the returned rows to our User objects */
    for (Map<String, Object> row : rows) {
        String username = (String) row.get("USERNAME");
        /* Check if the user is suspended */
        if(checkUserIsSuspended(row)){
            continue;
        }
        User user = new User();
        user.setUsername(username);
        user.setPassword((String) row.get("PASSWORD"));
        users.add(user);
    }
    return users;
}

private boolean checkUserIsSuspended(Map<String, Object> row) throws SubjectReaderException {
    final String startDateString = (String) row.get("SUSPEND_START_DATE"); // this errors
    if (startDateString != null) {
        final String endDateString = (String) row.get("SUSPEND_END_DATE");
        if (null != endDateString) {
            return checkDate(startDateString, endDateString); // this just compares the current date etc
        }
        /* Return true if the Suspended start date is not null, and there is no end date column, or it is null */
        return true;
    }
    /* Return false if the Suspended start date String is null - i.e. they have not been suspended */
    return false;
}

エラー:

java.lang.ClassCastException: com.sybase.jdbc3.tds.SybTimestamp cannot be cast to java.lang.String
4

1 に答える 1

2

オブジェクトを文字列にキャストしているため、常にこのエラーが発生しますcom.sybase.jdbc3.tds.SybTimestamp

フィルタを作成する代わりに、SQLで直接このチェックを行ってみませんか?何かのようなもの

SELECT USERNAME, PASSWORD, SUSPEND_START_DATE, SUSPEND_END_DATE
    FROM USERS WHERE SUSPEND_START_DATE >= ?

queryForListこれで、現在の時刻をパラメーターとして渡すことができます。

この直接キャストを回避するもう1つの方法は、RowMapperを使用することです。このようにして、ResultSet#getDate(String) を使用でき、JDBCドライバーが変換を処理するため、何もキャストする必要はありません:)

于 2013-01-03T17:30:02.060 に答える