0

我无法使用 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

结果

4

2 回答 2

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 无关。

于 2017-01-16T14:38:45.693 回答
0

哦,见鬼,我很抱歉浪费了你的时间。我显然想通了。

底层数据库在某个时候从 mysql 更改为 mariadb - 这是在将 mysql connector/j 与 mariadb 一起使用时某些驱动程序不兼容。使用 mariadb 驱动程序可以解决问题。

于 2017-01-17T18:30:48.793 回答