Spring JDBC使用where子句查询日期数据报参数转换错误如何解决
问题原因
- 类型不匹配:你代码中用到的
Date类导入的是java.sql.Date,而@DateTimeFormat注解默认只支持java.util.Date或Java 8+的java.time包下的日期类型,没有内置的字符串转java.sql.Date的转换策略 - 日期格式不匹配:HTML原生
<input type="date">控件提交的日期格式固定为yyyy-MM-dd,你配置的@DateTimeFormat(pattern="dd/MM/yyyy")和实际提交的格式完全不符 - SQL参数遗漏:你调用
JdbcTemplate.query方法时只传入了SQL语句和RowMapper,没有把start、end两个参数传入匹配SQL中的两个?占位符,即使参数转换成功,后续查询也会报错
解决步骤
推荐统一使用Java 8+官方推荐的LocalDate日期类型,无旧Date类的线程安全问题,Spring MVC原生支持转换,修改如下:
- 修正控制器参数配置
import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDate; @Controller public class EmpController { @Autowired EmpDao dao; @GetMapping("/viewemp") public String viewemp(@RequestParam(value="start") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate start, @RequestParam(value="end") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end, Model m){ List<Event> list = dao.getEmployees(start, end); m.addAttribute("list", list); return "viewemp"; } }
- 修正Event实体类的字段类型
import java.time.LocalDate; public class Event { private String eventName; private String eventOrgName; private int eventFare; private LocalDate startDate; private LocalDate endDate; // 补充对应getter、setter方法 }
- 修正EmpDao逻辑,补上SQL查询参数
import java.time.LocalDate; import java.util.List; public class EmpDao { JdbcTemplate template; public void setTemplate(JdbcTemplate template) { this.template = template; } public List<Event> getEmployees(LocalDate start, LocalDate end){ // 传入start、end参数匹配SQL占位符 return template.query("select * from Event where startDate=? and endDate=?", new Object[]{start, end}, (rs, row) -> { Event e = new Event(); e.setEventName(rs.getString(1)); e.setEventOrgName(rs.getString(2)); e.setEventFare(rs.getInt(3)); e.setStartDate(rs.getObject(4, LocalDate.class)); e.setEndDate(rs.getObject(5, LocalDate.class)); return e; }); } }
低JDK版本兼容方案
如果你的项目不支持Java 8+,可以将所有日期类型替换为java.util.Date,注意不要导入java.sql.Date包,Dao层取值时直接用rs.getDate()赋值即可(java.sql.Date是java.util.Date的子类,可直接转换)。
内容的提问来源于stack exchange,提问作者Sourav
相关产品推荐
相关产品推荐

