在Sybase中有一个表和一个sproc设置,如下所示:
创建表testtab(f float)
create proc insert_testtab @f float as insert testtab values(@f)
一个包含Double的java对象
class TestObj { Double getF() { return 12.34; } }
使用SimpleJdbcCall& BeanPropertySqlParameterSource:
SqlParameterSource params = new BeanPropertySqlParameterSource(new TestObj());
SimpleJdbcCall call = new SimpleJdbcCall(dataSource).withProcedureName("insert_testtab");
call.execute(params);
12.0会被插入数据库,而不是12.34。它似乎在封面下面,BeanPropertySqlParameterSource将数字作为java.sql.Types.NUMERIC传递给sproc并截断小数点。
任何人都可以帮忙解释一下,这可能是Spring中的Sybase代码问题,还是我做错了什么?
答案 0 :(得分:2)
最好的方法是使用BeanPropertySqlParamterSource对象注册属性的类型。否则,Spring在底层的CallableStatement上使用setObject。这使得所有由JDBC驱动程序实现决定如何处理数据。像params.registerSqlType("f", java.sql.Types.DECIMAL)
这样的东西应该可以解决问题。您还需要将params声明为BeanPropertySqlParameterSource
的实例才能使其正常工作。