You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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原生支持转换,修改如下:

  1. 修正控制器参数配置
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";  
    }  
}
  1. 修正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方法
}
  1. 修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 02:15:02