用springboot实现一个查询功能,在测试环境不报错,在生产环境会报错,但是再点击查询也能查出数据。
F12-网络-响应里报错:code:internal_server_error,message:Error attempting to get column 'xxx' from result set. Cause: java.sql.SQLException: Error。
生产环境日志里报错:uncategorized SQLException; SQL state [null]; error code [0]; Error; nested exception is java.sql.SQLException: Error
org.springframework.jdbc.UncategorizedSQLException: Error attempting to get column 'xxx' from result set. Cause: java.sql.SQLException: Error; at com.alibaba.druid.pool.DruidPooledResultSet.getBigDecimal(DruidPooledResultSet.java:480)
at org.postgresql.jdbc.PgResultSet.getBigDecimal(PgResultSet.java:438)
at org.postgresql.jdbc.PgResultSet.getBigDecimal(PgResultSet.java:434)
at org.postgresql.jdbc.PgResultSet.getBigDecimal(PgResultSet.java:2658)
at org.postgresql.jdbc.PgResultSet.getNumeric(PgResultSet.java:2683)
at org.postgresql.util.ByteConverter.numeric(ByteConverter.java:111)
at org.postgresql.util.ByteConverter.numeric(ByteConverter.java:157)
Caused by: java.lang.IllegalArgumentException: invalid length of bytes "numeric" value
这个字段在数据库里的数据类型是numeric,实体里是BigDecimal,精度没有限制,可以是空值,生产环境的最大值是1111111.111111。把生成环境的数据放在测试环境里测试,也不报错。生产环境里数据库版本:PostGreSQL 9.2.4(GaussDB 8.1.1 build 4394acf2) compiled at 2023-01-16 03:09:38 commit 2609 last mr 5121 release
测试环境的数据库版本:(openGauss 5.0.0 build a07d57c3) compiled at 2023-03-29 03:09:38 commit 0 last mr on x86_64-unknown-linux-gnu, compiled by g++ (GCC) 7.3.0, 64-bit,数据库驱动程序的版本是42.3.8。这个可能是什么原因导致的。
数据库中的字段类型是 numeric,而实体类中使用的是 BigDecimal,那么问题可能出在数据的长度或精度上
有两种解决方案
1.检查数据库字段的精度和范围:
确保数据库中的 numeric 字段定义了足够的精度和范围。例如,numeric(10, 2) 表示最多10位数字,其中2位小数。如果你尝试存储或读取超出这个范围的值,就会引发错误。
2.调整实体类的映射:
确保实体类中的 BigDecimal 字段与数据库中的 numeric 字段精度匹配。如果需要,可以在实体类中使用注解来指定精度,例如: