我在使用Sybase ( SimpleJdbcInsert.executeAndReturnKey驱动程序)和某些数据时遇到了一个奇怪的问题。
以下列例子为例:
SimpleJdbcInsert insert = new SimpleJdbcInsert(jdbcTemplate)
.withTableName("TABLE_NAME")
.usingGeneratedKeyColumns("ID");
List<String> columns = new ArrayList<String>();
columns.add("SOME_NUMERIC_DATA");
columns.add("SOME_STRING_DATA");
Map<String, Object> params = new HashMap<String, Object>();
params.put("SOME_NUMERIC_DATA", 10.02);
params.put("SOME_STRING_DATA", "AAAA");
Number insertId = insert.executeAndReturnKey(params);以上都会失败
DataIntegrityViolationException: Unable to retrieve the generated key for the insert插入本身很好,就像我执行insert.execute(params)一样,插入将正确工作(但我需要生成的列值)。
如果我为null列插入10.02而不是10.02,那么它将正确工作并返回生成的列值。另外,如果所有字段都是VARCHAR/String,那么它将正确工作。
有人能在这里看到任何可能导致这种情况的字符串和数字字段的组合吗?
我还应该补充一点,当我在H2数据库中使用完全相同的代码时,它一直在工作--这似乎与Sybase/jTDS有关。
发布于 2015-03-28 18:52:08
我对Server也有同样的问题,并在调用executeAndReturnKey()之前调用此配置方法来修复它
mySimpleJdbcInsert.setAccessTableColumnMetaData(false);我怀疑这个错误与数据库元数据有关:正如spring http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/jdbc.html中所解释的,SimpleJdbcInsert使用数据库元数据来构造实际的insert语句。
您还可以使用SQL OUTPUT子句,例如
INSERT INTO myTable (Name, Age)
OUTPUT Inserted.Id
VALUES (?,?)并使用一些更通用的JdbcTemplate.execute()来处理插入。
https://stackoverflow.com/questions/26161626
复制相似问题