Spring JPA Java [Литерал ORA-01861 не соответствует строке формата] - PullRequest
0 голосов
/ 24 мая 2019

Я получаю дату в формате 'гггг-мм-дд', когда пытаюсь сохранить дату в базе данных с помощью метода jpa save (). Я получаю сообщение об ошибке

java.sql.SQLException: ORA-01861: literal does not match format string

oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745)
oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216)
oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:966)
oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1170)
oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3339)
oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3423)
org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208)
org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:62)
org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3124)
org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3581)
org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:104)
org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:465)
org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:351)
org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350)
org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56)
org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1258)
org.hibernate.jpa.spi.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:1335)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:291)
com.sun.proxy.$Proxy48.flush(Unknown Source)
org.springframework.data.jpa.repository.support.SimpleJpaRepository.flush(SimpleJpaRepository.java:478)
org.springframework.data.jpa.repository.support.SimpleJpaRepository.saveAndFlush(SimpleJpaRepository.java:446)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:434)
org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:419)
org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:391)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)

Ниже приведен пример модели моей сущности

import java.util.Date;
import javax.persistence.*;
@Entity
@Table(name = "WIZ_PUBLISH_INVOICE")
public class PublishInvoice {
    @Id
    private int INVOICE_ID;

    @javax.persistence.Temporal(TemporalType.TIMESTAMP)
    @Column(name = "MATURITY_DATE")
    private Date MATURITY_DATE;

    @Transient
    private String mDATE;
}

Я получаю дату из пользовательского интерфейса в виде строки, которую затем преобразую в util.Date () перед сохранением, с помощью кода ниже

try {
    Date d = new SimpleDateFormat("yyyy-MM-dd").parse(publishInvoice.getmDATE());
    System.out.println(publishInvoice.getmDATE() + "\t" + d.toString());

    publishInvoice.setMATURITY_DATE(d);

} catch (ParseException e) {
    e.printStackTrace();
}
publishInvoiceService.save(publishInvoice);

Ниже моя таблица БД

CREATE TABLE "WIZ1"."WIZ_FACTLIVE_INVOICE" 
(   
    "MATURITY_DATE" DATE, 
    "INVOICE_ID" NUMBER NOT NULL ENABLE, 
     CONSTRAINT "WIZ_FACTLIVE_INVOICE_PK" PRIMARY KEY ("INVOICE_ID")
}

Дайте мне знать, если что-нибудь еще потребуется. Любая помощь приветствуется

1 Ответ

1 голос
/ 24 мая 2019

Я должен спросить вас, почему @Transient используется, попробуйте удалить его, если в этом нет необходимости.

См. Этот пример, чтобы понять ORA-01861 Я считаю, что oracle пытается сделать что-то подобное.

Запустите это в SQL Developer

SELECT TO_DATE (‘20190522’, ‘yyyy-mm-dd’) FROM dual;

, и вы получите сообщение об ошибке.ORA-01861

Запустите это, чтобы проверить, как это должно работать,

SELECT TO_DATE (‘2019-05-22’, ‘yyyy-mm-dd’) FROM dual;

С учетом сказанного у меня есть чувство, что ваш код, Date d = new SimpleDateFormat("yyyy-MM-dd").parse(publishInvoice.getmDATE()); не возвращает правильную дату.

Я считаю, что java Date может быть потенциальной проблемой здесь.обновить столбец базы данных с типом поля TIMESTAMP и java mDATE до java.sql.Timestamp;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...