【问题标题】:Unsupported conversion from DATE to java.lang.Integer不支持从 DATE 到 java.lang.Integer 的转换
【发布时间】:2020-04-14 07:41:46
【问题描述】:

所以,我使用 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.Datejava.sql.Date、...)

我也在用

  • mysql-connector-java: 8.0.19
  • io.ebean:12.1.8

【问题讨论】:

  • 不要添加不相关的标签。虽然应用程序。可能有GUI,从问题中可以看出问题与Swing无关。
  • @basil-bourque 我不知道你为什么要关闭这个问题。您发布给我的答案甚至没有谈到我面临的问题。不管怎样,我会去别的地方看看。
  • 你是对的,我关闭了一个不够匹配的问题。重新打开。

标签: java mysql ebean


【解决方案1】:

错误的数据类型

MySQL 中的DATETIME 数据类型表示日期和时间,但缺少任何时区或偏移量的概念。所以这种类型不能代表一个时刻,不是时间轴上的一个点。

此类型的标准 SQL 等效项是 TIMESTAMP WITHOUT TIME ZONE。 Java 中的等价物是LocalDateTime

要在标准 SQL 中记录时刻,请使用 TIMESTAMP WITH TIME ZONE。在 MySQL 中,TIMESTAMP。在 Java 中,InstantOffsetDateTimeZonedDateTime,JDBC 4.2 及更高版本需要支持 OffsetDateTime,而对其他两个的支持是可选的。

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 类。

【讨论】:

  • 这是非常好的信息 (+1)。不过,它好像没有解释提问者似乎与 Ebean 存在的问题。
  • 感谢您的回答,我已经提供了有关该问题的更多信息。虽然看起来即使使用LocalDateTIme 仍然存在同样的问题。
  • @AienSaidi 同样,LocalDateTime 是完全错误的数据类型。再次阅读我的答案。
  • 还是一样。无论如何,我必须改变模型。谢谢
猜你喜欢
  • 2023-03-30
  • 2013-07-15
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 2018-04-26
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多