问题描述
我正在尝试使用 JDBCTamplate 查询选择语句。 选择语句:
SELECT currency,SUM(amount) AS total
FROM table_name
WHERE user_id IN (:userIdList)
GROUP BY currency
数据库表有三列:
- user_id
- 货币
- 金额
以表格为例
user_id currency amount
1 EUR 9000
2 EUR 1000
3 USD 124
当我尝试运行此代码时
namedParamJDBCTemplate.query(query,new MapsqlParameterSource('user_id',userIdList),new ResultSetExtractor<Map>() {
@Override
public Map extractData(ResultSet resultSet) throws sqlException,DataAccessException {
HashMap<String,Object> mapRet = new HashMap<String,Object>();
while(resultSet.next()){
mapRet.put(resultSet.getString("currency"),resultSet.getString("total"));
}
return mapRet;
}
});
我将结果集设为地图,但金额的结果如下所示:
EUR -> 10000.0E0
USD -> 124.0E0
当我在数据库中运行相同的查询(不是通过代码)时,结果集很好,没有“0E0”。
如何在没有“0E0”的情况下仅获得 EUR -> 10000 和 USD-> 124?
解决方法
我认为
.0E0
是数字的指数。所以 124.0E0
代表 124.0 乘以 10 的 0 次方(写成 124 x 10^0)。任何的 0 次方都是 1,所以你有 124 x 1,当然,这是正确的值。
(如果是,例如 124.5E3,则表示 124500。)
这种表示法更常用于处理大数,因为 5436.7E20 比 543670000000000000000000 更具可读性。
在不了解您的数据库背景的情况下,我只能假设这种表示法是由数字字段转换为字符串(在 result.getString("total")
中)引起的。因此,您应该问问自己,您是否真的需要将结果作为字符串(或仅使用 .getFloat
左右,同时更改您的 HashMap 类型)。如果是这样,您仍然有一些可能性:
-
稍后将值转换为字符串 → e. G。
String.valueOf(resultSet.getFloat("total"))
-
截断
.0E0
→ e。 G。resultSet.getString("total").replace(".0E0","")
(注意,如果出于某种原因,如果您得到另一个后缀,如.5E3
,这当然不起作用;它还会截断小数点后的任何位置) -
也许可以找到抑制
E
-Notation 的数据库、JDBC 或驱动程序设置。