Oracle NamedParameterJdbcTemplate查询参数中的BigInteger导致错误

Oracle NamedParameterJdbcTemplate查询参数中的BigInteger导致错误,oracle,jdbctemplate,Oracle,Jdbctemplate,我正在使用NamedParameterJdbcTemplate执行一个查询。查询参数CustomerId的类型为BigInteger,如 queryParams.put(“CustomerId”,request.getcustomerid()); 当执行查询时,它抛出“使用了无效数据类型”的异常。 不允许使用BigInteger?在不丢失数据的情况下,安全的替代方案是什么?使用SqlParameterSource实现和java.sql.Types MapSqlParameterSource qu

我正在使用NamedParameterJdbcTemplate执行一个查询。查询参数CustomerId的类型为BigInteger,如 queryParams.put(“CustomerId”,request.getcustomerid()); 当执行查询时,它抛出“使用了无效数据类型”的异常。
不允许使用BigInteger?在不丢失数据的情况下,安全的替代方案是什么?使用
SqlParameterSource
实现和
java.sql.Types

MapSqlParameterSource queryParams = new MapSqlParameterSource();
queryParams.put("CustomerId", request.getCusttomerId(), Types.BIGINT);

namedParameterJdbcTemplate.queryForObject(sqlString, queryParams);

CustomerId
参数的数据库中的数据库类型是什么,其预期范围是什么?您应该使用与之最接近的任何类型
BigInteger
是一个任意精度值,但您可能并不需要一个可以容纳(比如)一百万位数字的客户ID。@数据库中的JeroenMostert数据类型是数字(20),它仍然非常大。没有“小”类型可以保存该值,但是
bigdecime
应该保存,并且它是
PreparedStatement
支持的内容之一,因此它有很好的工作机会。从biginger转换为bigdecime时不会丢失数据?没有。
bigdecime
基本上就是带有小数点的
bigdecimer
。从
BigDecimal
biginger
(反过来)时,您必须小心,因为显然,
biginger
没有小数点。总而言之,您应该看看客户ID是否真的应该是20位数字。一个
long
最多可容纳18位数字,而
int
只能容纳9位数字,很少有企业的实际客户数量超过了21亿,这就需要更大的类型。(使用较大的数字还有其他原因,但是
NUMBER(20)
也可能是不明智的默认值。)