我使用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。
发布于 2016-09-22 20:38:07
这是因为jdbcTemplate试图将"MYSEQ.NEXTVAL"解析为长整型,这是ID的数据类型。不能将SQL语句作为命名参数发送。
发布于 2021-07-01 12:13:45
我们不能直接在SimpleJdbcInsert中使用Oracle sequence。为此,我们必须使用triggers并动态插入序列值。
我的表名是
产品(ID、名称、数量、价格)
创建一个数据库触发器(在我的例子中,它是一个用于获取pk值的数据库触发器PROD_ID)
CREATE OR REPLACE TRIGGER PROD_PK_GEN_TRIGGER
在产品上插入之前的
每行的
BEGIN
选择PROD_SEQ.NEXTVAL
进入:new.ID的
来自DUAL的;
结束;
中使用id作为自动生成的密钥
SimpleJdbcInsert simpleJdbcInsert =新产品(DataSource).withTableName(“产品”) .usingGeneratedKeyColumns("ID");
executeAndReturnKey()方法执行并获取自动生成的密钥.intValue(); id = simpleJdbcInsert .executeAndReturnKey(新BeanPropertySqlParameterSource(产品)) int
注意:默认情况下,executeAndReturnKey()方法会返回java.lang.Number类型,为了在int类型中获取pk,我们必须使用intValue()方法。
https://stackoverflow.com/questions/38543659
复制相似问题