问题背景
- 数据库字段类型是 YEAR (如 2023)
- Java 实体类中使用 String 类型接收
- 直接查询时返回的是类似 “2023-01-01” 的格式
CAST(establish_year AS CHAR) 的作用
当你使用 CAST(establish_year AS CHAR)
时,MySQL 会将 YEAR 类型显式转换为字符串类型,这会:
- 去除日期部分:直接将 YEAR 值转换为纯数字字符串(如 “2023”)
- 避免自动转换:防止 MySQL 默认将 YEAR 类型转换为完整日期格式
- 匹配实体类:转换后的纯数字字符串能更好地与实体类的 String 类型对应
为什么直接查询会返回 “xxxx-01-01”
MySQL 的 YEAR 类型在以下情况会自动转换为完整日期:
- 当 JDBC 驱动获取 YEAR 类型时,可能会将其视为 DATE 类型
- 默认补全为当年第一天的日期(xxxx-01-01)
其他解决方案
除了 CAST 外,还有其他方法可以解决:
- 使用
DATE_FORMAT(establish_year, '%Y')
明确格式化 - 在实体类中使用 Integer 类型而非 String 来接收 YEAR 值
- 使用 MyBatis 等 ORM 框架的类型处理器进行自定义转换
- 修改数据库,使用varchar
- 修改实体类使用 year