应使用COALESCE在SQL层将SUM(price)的NULL转为0.00等确定值,避免Java端BigDecimal接收null抛NPE;COALESCE是标准SQL函数,跨数据库兼容,优于ISNULL或IFNULL。

当数据库中 SUM(price) 返回 NULL(比如表中没有匹配记录),Java 用 BigDecimal 接收时会抛 NullPointerException,因为 JDBC 默认把 SQL 的 NULL 映射为 Java 的 null,而 BigDecimal 是不可为空的引用类型,不能直接赋值 null。
用 COALESCE 在 SQL 层兜底
最稳妥的做法是在 SQL 查询里用 COALESCE 把 SUM 的 NULL 转成确定值(如 0),避免 Java 层收到 null:
SELECT COALESCE(SUM(price), 0) FROM orders WHERE status = 'paid'- 这样无论是否有数据,结果都是一个非空数值(
0或实际和),JDBC 可安全映射为new BigDecimal("0")或具体值 - 注意:
COALESCE(SUM(...), 0)中的0类型要与price字段一致(如DECIMAL),推荐写成0.00或0.0以匹配精度
MyBatis 中的写法示例
在 XML Mapper 中直接写带 COALESCE 的 SQL:
SELECT COALESCE(SUM(price), 0.00) FROM product WHERE category_id = #{categoryId}
</select>
Java 调用后可直接接收,无需判空:
立即学习“Java免费学习笔记(深入)”;
BigDecimal total = mapper.sumPrice(123); // 永远不为 null如果不能改 SQL,Java 层做防御性处理
若 SQL 固定无法修改(如调用视图或第三方接口),需在 Java 中主动判断:
- 用
ResultSet.getObject("col", BigDecimal.class)获取,它可能返回null - 手动转为默认值:
BigDecimal result = rs.getObject("sum_price", BigDecimal.class); return result != null ? result : BigDecimal.ZERO; - Spring JDBC 的
JdbcTemplate.queryForObject也同理,捕获并转换null
为什么不用 ISNULL 或 IFNULL?
COALESCE 是标准 SQL 函数,跨数据库兼容(MySQL、PostgreSQL、Oracle、SQL Server 都支持);而 ISNULL(SQL Server)或 IFNULL(MySQL)是方言,换库易出错。统一用 COALESCE 更安全可靠。


















