Неподдерживаемое преобразование из DATE в java .lang.Integer - PullRequest
0 голосов
/ 14 апреля 2020

Итак, у меня есть следующая модель, сгенерированная с использованием библиотеки 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.19
  • io.ebean: 12.1.8

1 Ответ

0 голосов
/ 14 апреля 2020

Неверный тип данных

Тип данных DATETIME в MySQL представляет дату и время дня, но не имеет понятия о часовом поясе или смещении. Таким образом, этот тип не может представлять момент, не является точкой на временной шкале.

Стандартный SQL эквивалент этого типа TIMESTAMP WITHOUT TIME ZONE. Эквивалент в Java равен LocalDateTime.

enter image description here

Чтобы записать момент в стандарте SQL, используйте TIMESTAMP WITH TIME ZONE. В MySQL, TIMESTAMP. В Java, Instant, OffsetDateTime и ZonedDateTime с поддержкой OffsetDateTime, необходимой для JDB C 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, в который он пытается создать экземпляр.

...