3

我使用 SimpleJdbcInsert 作为,

SimpleJdbcInsert simpleJdbcInsert = new SimpleJdbcInsert(dataSource).withTableName(TABLE_NAME).withSchemaName(SCHEMA_NAME);

Map<String, Object> namedParameterMap = new HashMap<String, Object>();
namedParameterMap.put("ID", "MYSEQ.NEXTVAL");
namedParameterMap.put("COLUMN1NAME",obj1.getColumn1Value());
namedParameterMap.put("COLUMN2NAME", obj1.getColumn2Value());

simpleJdbcInsert.withoutTableColumnMetaDataAccess().execute(namedParameters);

但它只对 ID 列抛出错误,其他列工作正常,我通过注释掉 ID 列确认。

java.lang.NumberFormatException: null

我检查了我的 Oracle 序列,它工作正常。我检查了许多博客,但找不到使用 Oracle 序列和 SimpleJdbcInsert 的合适博客。

4

2 回答 2

2

这是因为 jdbcTemplate 试图解析"MYSEQ.NEXTVAL"成一个 long,这是ID. 您不能将 SQL 语句作为命名参数发送。

于 2016-09-22T12:38:07.090 回答
0

我们不能直接使用Oracle sequenceSimpleJdbcInsert为此,我们必须triggers动态使用和插入序列值。

我的表名是

产品(ID、名称、数量、价格)

  1. 创建一个数据库sequence(在我的情况下它的PROD_ID
  2. 创建用于获取 PK 值的数据库触发器


在插入产品之前创建或替换触发器 PROD_PK_GEN_TRIGGER
每 行开始 SELECT PROD_SEQ.NEXTVAL INTO :new.ID
FROM DUAL; 结尾;



  1. 在 java 代码中使用 id 作为自动生成的键
SimpleJdbcInsert simpleJdbcInsert = 
     new SimpleJdbcInsert(dataSource)
          .withTableName("PRODUCT")
          .usingGeneratedKeyColumns("ID");
  1. 调用executeAndReturnKey()方法执行并获取自动生成的密钥

          int  id  =  
             simpleJdbcInsert .executeAndReturnKey(
                 new BeanPropertySqlParameterSource(product))
                 .intValue();
    

注意:: 默认情况下,这里executeAndReturnKey()方法将返回java.lang.Number类型,要获取类型中的 pk,int我们必须使用intValue()方法。

于 2021-07-01T04:13:45.320 回答