java - 不支持从 DATE 到 java.lang.Integer 的转换
问题描述
因此,我使用 Java Ebean 库生成了以下模型:
package models;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import java.time.LocalDateTime;
@Entity
@Table(name = "Zeit")
public class Zeit extends BaseModel {
@Column
private LocalDateTime start;
@Column
private LocalDateTime ende;
@Column
private int pause;
@ManyToOne(optional = false)
private Benutzer benutzer;
@Column
private LocalDateTime pauseStart;
public Zeit() {
}
public Zeit(LocalDateTime start, LocalDateTime ende, int pause, LocalDateTime pauseStart) {
this.start = start;
this.ende = ende;
this.pause = pause;
this.pauseStart = pauseStart;
}
public LocalDateTime getStart() {
return start;
}
public void setStart(LocalDateTime start) {
this.start = start;
}
public LocalDateTime getEnde() {
return ende;
}
public void setEnde(LocalDateTime ende) {
this.ende = ende;
}
public int getPause() {
return pause;
}
public void setPause(int pause) {
this.pause = pause;
}
public Benutzer getBenutzer() {
return benutzer;
}
public void setBenutzer(Benutzer benutzer) {
this.benutzer = benutzer;
}
public LocalDateTime getPauseStart() {
return pauseStart;
}
public void setPauseStart(LocalDateTime pauseStart) {
this.pauseStart = pauseStart;
}
}
这会导致以下 SQL 语句:
create table zeit (
id bigint auto_increment not null,
start datetime(6),
ende datetime(6),
pause integer not null,
version bigint not null,
when_created datetime(6) not null,
when_modified datetime(6) not null,
constraint pk_zeit primary key (id)
);
这个想法是我想将打开和关闭时间写到数据库中。这基本上可以通过使用
private void btn_anmeldenActionPerformed(java.awt.event.ActionEvent evt) {
try {
Zeit z = new Zeit();
z.setStart(LocalDateTime.now());
z.setBenutzer(benutzer);
z.save();
btn_anmelden.setText(String.valueOf(z.getStart()));
btn_anmelden.setEnabled(false);
} catch (Exception e) {
}
}
但是当使用以下方法从数据库中取回实体时:
private void initState() {
Zeit lastTime = new QZeit().findList().get(0);
System.out.println(lastTime);
}
我得到错误:
com.mysql.cj.exceptions.DataConversionException: Unsupported conversion from TIMESTAMP to java.lang.Integer
到目前为止,我试图
- 更改数据库中的不同数据类型
- 在我的代码中使用不同的类型 (
java.util.Date
,java.sql.Date
, ...)
我也在使用
mysql-connector-java
: 8.0.19io.ebean
:12.1.8
解决方案
错误的数据类型
MySQL 中的DATETIME
数据类型表示日期和时间,但缺少任何时区或偏移量的概念。所以这种类型不能代表一个时刻,不是时间轴上的一个点。
这种类型的标准 SQL 等效项是TIMESTAMP WITHOUT TIME ZONE
. Java 中的等价物是LocalDateTime
.
要在标准 SQL 中记录时刻,请使用TIMESTAMP WITH TIME ZONE
. 在 MySQL 中,TIMESTAMP
. 在 Java 中Instant
,OffsetDateTime
、 和ZonedDateTime
, 支持OffsetDateTime
JDBC 4.2 及更高版本,而对其他两个的支持是可选的。
OffsetDateTime odt = OffsetDateTime.now() ;
myPreparedStatement.setObject( … , odt ) ; // Writing to a column of MySQL type `TIMESTAMP`, standard SQL `TIMESTAMP WIH TIME ZONE`.
恢复。
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
至于 ebean 错误,您没有提供足够的详细信息。我们需要查看它试图实例化的 Java 类。
推荐阅读
- python - Cython 库未加载:@rpath/libpython3.8.dylib
- pandas - 运行时为 MultiIndex DataFrame 设置值变慢
- powerquery - 使用 Power Query 从非系统生成的报告生成新格式
- c++ - 当您更喜欢 C++ 中的虚函数而不是模板时?
- macos - .dmg 和 .app 文件有什么区别?
- c# - 将数据库中的 3 列合并到 datagridview 中的 1 列
- reactjs - React Router v5 - 没有精确道具的嵌套路由
- ios - 为什么我收到线程 1:信号 SIGABRT
- git - 如何正确设置上游并将主分支中的更改反转为先前的提交状态?
- php - PHP发布值但数据库未在托管上更新