如何将对象的sql时间转换为java时间?

时间:2018-12-05 14:36:55

标签: java time java-time localtime incompatibletypeerror

当我运行这段代码时,它会说:

  

错误:(43,31)java:不兼容的类型:java.sql.Time不能为   转换为java.time.LocalTime

public TrackTime read(int id){

        rs = jdbc.queryForRowSet("SELECT * FROM tracktime where id ='" + id + "'");
        while (rs.next()){
            return new TrackTime (rs.getInt("id"),
                    rs.getDate("date"),
                    rs.getTime("startTime"),
                    rs.getTime("endTime"),
                    rs.getString("licenseType"),
                    rs.getInt("trackNumber"));
        }

        return new TrackTime();
    }

什么是导致此错误的原因?

2 个答案:

答案 0 :(得分:1)

正如其他人已经说过的,这一定是因为您TrackTime的构造函数期望类型为LocalTime的参数,而rs.getTime返回的是java.sql.Time

假设JDBC 4.2(或更高版本;您可能有),请使用getObject从结果集中检索java.time类,例如LocalTimeLocalDate

    return new TrackTime (rs.getInt("id"),
            rs.getObject("date", LocalDate.class),
            rs.getObject("startTime", LocalTime.class),
            rs.getObject("endTime", LocalTime.class),
            rs.getString("licenseType"),
            rs.getInt("trackNumber"));

我也可以自由更改日期的检索,这可能会给您带来新的编译时错误。但是,既然您已经在使用java.time,则最好更改TrackTime构造函数以接受LocalDate

如果您的JDBC驱动程序尚未兼容JDBC 4.2,请考虑升级。

答案 1 :(得分:0)

您的TrackTime类的构造函数必须期待类LocalTime的对象,其中rs.getTime("startTime")返回java.sql.Time而不是LocalTime,因此两者都不相同您得到错误。

您可以在toLocalTime()对象上使用Time方法,该方法返回LocalTime对象,这样正确的对象类型将传递给构造函数,并且可以避免错误。

因此,在您的代码中,您需要这样做,

while (rs.next()){
    return new TrackTime (rs.getInt("id"),
            rs.getDate("date"),
            rs.getTime("startTime").toLocalTime(),
            rs.getTime("endTime").toLocalTime(),
            rs.getString("licenseType"),
            rs.getInt("trackNumber"));
}