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