Spring JPA Java[ORA-01861文本与格式字符串不匹配]

Spring JPA Java[ORA-01861文本与格式字符串不匹配],java,spring,oracle,jpa,spring-data-jpa,Java,Spring,Oracle,Jpa,Spring Data Jpa,当我试图通过spring JPA save()方法将日期保存到数据库中时,我收到了一个“yyyy-MM-dd”格式的日期。我遇到了一个错误 java.sql.SQLException: ORA-01861: literal does not match format string oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) oracle.jdbc.driver.T4CTTIoer.proc

当我试图通过spring JPA save()方法将日期保存到数据库中时,我收到了一个“yyyy-MM-dd”格式的日期。我遇到了一个错误

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 = "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;
}
我从UI中获取字符串中的日期,然后在保存之前通过下面的代码将其转换为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"."INVOICE" 
(   
    "MATURITY_DATE" DATE, 
    "INVOICE_ID" NUMBER NOT NULL ENABLE, 
     CONSTRAINT "WIZ_PK" PRIMARY KEY ("INVOICE_ID")
}

如果还需要什么,请告诉我。非常感谢您的帮助

我必须问您为什么要使用
@Transient
,如果没有必要,请尝试删除它

请参阅此示例以了解ORA-01861 我认为甲骨文正试图做这样的事情

在SQLDeveloper中运行此命令

SELECT TO_DATE (‘20190522’, ‘yyyy-mm-dd’) FROM dual;
你会发现你看到的错误。ORA-01861

运行此命令以验证其工作方式

SELECT TO_DATE (‘2019-05-22’, ‘yyyy-mm-dd’) FROM dual;
话虽如此,我感觉到你的代码,
dated=newsimpledateformat(“yyyy-MM-dd”).parse(publishInvoice.getmDATE())未返回正确的日期


我相信java
Date
可能是这里的潜在问题。使用字段类型
TIMESTAMP
和java
mDATE
将数据库列更新为
java.sql.TIMESTAMP

您是否尝试使用
TemporalType.DATE
作为到期日?顺便说一下,实体
WIZ_PUBLISH_INVOICE
中的表名与实际表
WIZ_FACTLIVE_INVOICE
的名称不匹配。您说您收到的日期字符串格式为“dd MMM yy”,但我在代码中看到的唯一日期格式是“yyy-MM-dd”???
system.out.println(publishInvoice.getmDATE())的输出是什么-已删除d.toString();