ActiveJDBCを使用してdbからモデルを読み込めません。ActiveJDBC、SQLとnullタイムスタンプ生成SQLException
基本的に、私は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との組み合わせですか?
EDIT:以下に示す最小限の例です。
表
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
テーブルのDDLを含めてください – ipolevoy