Error attempting to get column 'jhkg_date' from result set. Cause: java.sql.SQLException: Zero date value prohibited\n; Zero date value prohibited; nested exception is java.sql.SQLException: Zero date value prohibited"
时间: 2025-06-05 13:52:37 浏览: 11
### Java SQL 查询中出现 'Zero date value prohibited' 的解决方案
当执行 SQL 查询时遇到 `java.sql.SQLException: Zero date value prohibited` 错误,通常是因为数据库中的某些日期字段存储了非法值(如 `'0000-00-00'` 或其他不合法的日期)。这种情况下,JDBC 驱动程序会抛出异常,因为默认不允许处理零日期。
以下是几种可能的解决方法:
#### 方法 1:修改 JDBC URL 参数
可以通过调整 MySQL 数据库连接字符串来允许将零日期转换为 NULL。这可以在应用程序配置文件中完成,例如 `application-dev.yml` 和 `application-prod.yml` 文件[^2]。
在数据库连接 URL 中添加参数 `zeroDateTimeBehavior=convertToNull`,这样可以将 `'0000-00-00'` 转换为 `NULL` 值,从而避免异常发生。
示例配置:
```yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC&zeroDateTimeBehavior=convertToNull
```
此方法适用于无法更改表结构的情况,并能有效防止应用层崩溃[^2]。
---
#### 方法 2:清理数据库中的非法数据
如果能够访问并修改数据库,则建议检查相关表的数据,确保所有日期类型的字段都包含有效的日期值。对于已存在的非法数据,可以选择将其更新为合理的默认值或删除这些记录。
SQL 更新语句示例:
```sql
UPDATE your_table SET jhkg_date = CURRENT_DATE WHERE jhkg_date = '0000-00-00';
```
通过这种方式可以从源头解决问题,减少后续维护成本[^4]。
---
#### 方法 3:自定义 MyBatis 映射逻辑
如果使用的是 MyBatis 框架,还可以尝试重写映射器以捕获潜在的异常情况。例如,在获取列值之前先验证其合法性。
MyBatis XML 映射文件片段:
```xml
<resultMap id="BaseResultMap" type="com.example.YourEntity">
<result column="jhkg_date" property="jhkgDate" javaType="java.util.Date"
typeHandler="com.example.CustomDateTypeHandler"/>
</resultMap>
```
对应的 TypeHandler 实现类:
```java
public class CustomDateTypeHandler extends BaseTypeHandler<Date> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Date parameter, JdbcType jdbcType) throws SQLException {
ps.setDate(i, new java.sql.Date(parameter.getTime()));
}
@Override
public Date getNullableResult(ResultSet rs, String columnName) throws SQLException {
try {
return rs.getDate(columnName);
} catch (SQLException e) {
// 如果读取到非法日期则返回 null
return null;
}
}
@Override
public Date getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
try {
return rs.getDate(columnIndex);
} catch (SQLException e) {
return null;
}
}
@Override
public Date getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
try {
return cs.getDate(columnIndex);
} catch (SQLException e) {
return null;
}
}
}
```
这种方法提供了更灵活的方式去控制如何处理非法日期值[^1]。
---
#### 方法 4:编程层面设置默认值
在插入新纪录或者保存对象前,应始终确认日期字段已被赋予合理值。比如下面这段代码展示了如何在新增操作时自动填充当前时间戳作为默认值[^4]。
示例代码:
```java
@AutoLog(value = "wr_season_b-添加")
@ApiOperation(value = "wr_season_b-添加", notes = "wr_season_b-添加")
@PostMapping(value = "/add")
public Result<?> add(@RequestBody WrSeasonB wrSeasonB) {
Date currentDate = new Date();
if (wrSeasonB.getUpdateTime() == null || wrSeasonB.getUpdateTime().toString().equals("0000-00-00")) {
wrSeasonB.setUpdateTime(currentDate);
}
wrSeasonBService.save(wrSeasonB);
if (wrSeasonB != null) {
dataCache.addOrUpdateCache("WrSeasonB", wrSeasonB.getSeasonNm(),
wrSeasonB.getStartDate() + "," + wrSeasonB.getEndDate());
}
return Result.OK("添加成功!");
}
```
以上做法不仅有助于预防未来再次遭遇相同问题,还能提升整体代码质量。
---
### 总结
针对 `java.sql.SQLException: Zero date value prohibited` 异常,推荐优先采用 **方法 1** 修改 JDBC 连接串;其次考虑修正源数据 (**方法 2**) 或者增强业务逻辑以规避风险 (**方法 3 & 4**)。实际项目开发过程中需综合评估各种方案优劣再做决定。
阅读全文
相关推荐



















