java.sql.SQLException:ORA-00932:不一致的数据类型:插入空时间戳时预期日期为二进制

java.sql.SQLException:ORA-00932:不一致的数据类型:插入空时间戳时预期日期为二进制,java,sql,oracle,spring-data,jpql,Java,Sql,Oracle,Spring Data,Jpql,我有一个插入查询,其中与其他字段一起插入时间戳。现在,无论何时,Timestamp的值为null,我都会得到错误- java.sql.SQLException: ORA-00932: inconsistent datatypes: expected DATE got BINARY 我正在使用Oracle11g 查询是: @Modifying @Query(value ="INSERT INTO mams_asset a ( a.mams_asset_id, a.mams_folder_id,

我有一个插入查询,其中与其他字段一起插入时间戳。现在,无论何时,Timestamp的值为null,我都会得到错误-

java.sql.SQLException: ORA-00932: inconsistent datatypes: expected DATE got BINARY
我正在使用Oracle11g

查询是:

@Modifying
@Query(value ="INSERT INTO mams_asset a ( a.mams_asset_id, a.mams_folder_id, a.asset_name, a.gist, a.last_modified_date, a.last_exported_date, a.created_date ) VALUES (hextoraw(?1), hextoraw(?2), ?3, ?4, ?5, ?6 , ?7)" , nativeQuery = true)
int insertIntoMamsAsset(String mamsAssetId, String mamsFolderId, String assetName, String gist, Timestamp lastModifiedDate, Timestamp lastExportedDate, Timestamp createdDate);
这是spring数据JPA one。我也尝试过使用这种方法,但同样的错误是:

public int insertIntoMamsAsset(String mamsAssetId, String mamsFolderId, String assetName, String gist, Timestamp lastModifiedDate, Timestamp lastExportedDate, Timestamp createdDate){

        final Query query = entityManager.createNativeQuery("INSERT INTO mams_asset a ( a.mams_asset_id, a.mams_folder_id, a.asset_name, a.gist, a.last_modified_date, a.last_exported_date, a.created_date ) VALUES (hextoraw(?), hextoraw(?), ?, ?, ?, ? , ?)")
                .setParameter(1, mamsAssetId)
                .setParameter(2,mamsFolderId)
                .setParameter(3,assetName)
                .setParameter(4,gist)
                .setParameter(5,lastModifiedDate)
                .setParameter(6,lastExportedDate)
                .setParameter(7,createdDate);

        return query.executeUpdate();


    }
虽然查询看起来很长,但您只能关注时间戳字段,这就是产生错误的原因


解决方法是什么?

这是因为您的表不允许上次修改日期的空值

在像这样启动查询之前,尝试检查输入值lastModifiedDate是否为null或no

if(lastModifiedDate = null){
Timestamp myModifiedDate = new Timestamp(0001-01-01 00:00:00);
}
或者简单地更改数据库,如下所示:

ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL

当您尝试从不同类型向列插入值以获取更多详细信息时,会出现此oracle消息:

现在插入日期值,以便更好地使用Calendar类或date类。

这对我很有用

 final Query query = entityManager.createNativeQuery("INSERT INTO mams_asset a ( a.mams_asset_id, a.mams_folder_id, a.asset_name, a.gist, a.last_modified_date, " +
                "a.last_exported_date, a.created_date ) VALUES (hextoraw(?), hextoraw(?), ?, ?, ?, ? , ?)")
                .setParameter(1, mamsAssetId)
                .setParameter(2, mamsFolderId)
                .setParameter(3, assetName)
                .setParameter(4, gist)
                .setParameter(5, lastModifiedDate, TemporalType.TIMESTAMP)
                .setParameter(6, lastExportedDate, TemporalType.TIMESTAMP)
                .setParameter(7, createdDate, TemporalType.TIMESTAMP);
我在setParameter中添加了
TemporalType.TIMESTAMP