在SimpleJdbcInsert对象中指定Oracle Sequence以从Oracle Sequence生成密钥

时间:2016-07-23 15:55:34

标签: oracle spring-jdbc jdbctemplate simplejdbcinsert database-sequence

我使用的是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序列,它正常工作正常。我查了很多博客,但找不到使用SimpleJdbcInsert的Oracle序列的正确博客。

2 个答案:

答案 0 :(得分:2)

这是因为jdbcTemplate尝试将"MYSEQ.NEXTVAL"解析为lang,这是ID的数据类型。您不能将SQL语句作为命名参数发送。

答案 1 :(得分:0)


我们不能直接在 sequence 中使用 Oracle SimpleJdbcInsert。为此,我们必须使用 triggers 并动态插入序列值。

我的表名是

<块引用>

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

  1. 创建一个数据库 sequence(在我的例子中是它的 PROD_ID
  2. 创建数据库触发器以获取 PK 值
<块引用>

创建或替换触发器 PROD_PK_GEN_TRIGGER
在插入产品之前
对于每一行
开始
SELECT PROD_SEQ.NEXTVAL
INTO :new.ID
从双;
结束;

  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 类型并且要在 int 类型中获取 pk,我们必须使用 intValue() 方法。