我在使用ActiveJDBC从db读取模型时遇到了问题。
基本上,我正在使用ModelClass.findFirst(...)并弹出一个SQLException。如果时间戳字段不为零,则似乎没有问题。
所述模型有一个mysql时间戳(也尝试过datetime)字段,其中包含零/空值。此示例是值为'0000-00-00 00:00:00'的时间戳。如果我将值更新为实际日期/时间,则会填充模型对象而不会出现错误。
Caused by: java.sql.SQLException: Value '10151payment100.0012002017-01-16 02:06:530000-00-00 00:00:002017-01-16 03:36:43noFirst Last
+358 40 123456b989e4dce9e639eaadbed3b64e2c3eb' can not be represented as java.sql.Timestamp
我的问题是 - 我需要在此列中存储任意日期+时间,并且为方便起见,如果尚未存储值,则它应为null或零。这是与ActiveJDBC的可能组合吗?
编辑:以下重现的最小示例。
表
CREATE TABLE test (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
ts timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into test (id) values (1);
模型来源
import org.javalite.activejdbc.Model;
import org.javalite.activejdbc.annotations.Table;
@Table("test")
public class Test extends Model {
}
主要课程
import com.zaxxer.hikari.HikariDataSource;
import javax.sql.DataSource;
import org.javalite.activejdbc.Base;
public class ActiveJDBCTest {
private HikariDataSource dbds;
public ActiveJDBCTest() {
try {
init();
} catch (Exception e) {
System.out.println(e);
}
}
public void init() throws ClassNotFoundException {
Class.forName("com.mysql.jdbc.Driver");
dbds = new HikariDataSource();
dbds.setJdbcUrl("jdbc:mysql://localhost:3306/test" +
"?useSSL=false" +
"&characterEncoding=UTF-8");
dbds.setUsername("test");
dbds.setPassword("test");
dbds.setConnectionInitSql("SET @@session.time_zone = '+00:00'");
Base.open(dbds);
Test first = Test.findFirst("id = ?", 1);
Base.close();
}
public static void main(String[] args) {
new ActiveJDBCTest();
}
}
结果(请参阅嵌入图像了解实际异常消息 - 空字符?)
org.javalite.activejdbc.DBException: java.sql.SQLException: Value '10000-00-00 00:00:00' can not be represented as java.sql.Timestamp
答案 0 :(得分:0)
如果没有完整的堆栈跟踪和DDL,我只能看到您的列中包含以下值:
10151payment100.0012002017-01-16 02:06:530000-00-00 00:00:002017-01-16 03:36:43noFirst Last
+358 40 123456b989e4dce9e639eaadbed3b64e2c3eb
MySQL驱动程序告诉你它can not be represented as java.sql.Timestamp
。我认为你有某种数据损坏问题。我不认为它与ActiveJDBC有关。
答案 1 :(得分:0)
哦,天哪,我很抱歉浪费你的时间。我显然已经明白了。
底层数据库在某些时候已经从mysql更改为mariadb - 当使用mysql connector / j和mariadb时,这是一些驱动程序不兼容。使用mariadb驱动程序可以解决问题。