我使用的是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序列的正确博客。
答案 0 :(得分:2)
这是因为jdbcTemplate尝试将"MYSEQ.NEXTVAL"
解析为lang,这是ID
的数据类型。您不能将SQL语句作为命名参数发送。
答案 1 :(得分:0)
我们不能直接在 sequence
中使用 Oracle SimpleJdbcInsert
。为此,我们必须使用 triggers
并动态插入序列值。
我的表名是
<块引用>产品(ID、名称、数量、价格)
sequence
(在我的例子中是它的 PROD_ID)创建或替换触发器 PROD_PK_GEN_TRIGGER
在插入产品之前
对于每一行
开始
SELECT PROD_SEQ.NEXTVAL
INTO :new.ID
从双;
结束;
SimpleJdbcInsert simpleJdbcInsert =
new SimpleJdbcInsert(dataSource)
.withTableName("PRODUCT")
.usingGeneratedKeyColumns("ID");
调用executeAndReturnKey()
方法执行并获取自动生成的密钥
int id =
simpleJdbcInsert .executeAndReturnKey(
new BeanPropertySqlParameterSource(product))
.intValue();
注意 :: 默认情况下,executeAndReturnKey()
方法将返回 java.lang.Number
类型并且要在 int
类型中获取 pk,我们必须使用 intValue()
方法。