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

使用JdbcTemplate.query()时BETWEEN操作触发SQLSyntaxErrorException问题求助

解决Spring Boot JdbcTemplate SQL语法错误问题

问题根源

你的SQL查询语句存在重复的FROM关键字:原语句写成了SELECT * FROM from onboarding ...,这是直接触发SQLSyntaxErrorException的原因,和MySQL版本、BETWEEN操作符的用法无关。

修复方案

1. 修正SQL语句

删除重复的FROM,正确的查询语句如下:

SELECT * FROM onboarding WHERE `date` BETWEEN ? AND ?

2. 修复实体类映射错误

在RowMapper的mapRow方法中,你调用了onboarding.setEmailId(rs.getString("email"));,但实体类Onboarding的属性是email,对应的setter方法应为setEmail,需要修正这一行代码。

完整修正后的DAO实现代码

@Repository
public class OnbaordingReportDAOImpl implements OnbaordingReportDAO {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @SuppressWarnings("deprecation")
    @Override
    public List<Onboarding> listByDateBetween(String startDate, String endDate) {
        List<Onboarding> list = jdbcTemplate.query(
                "SELECT * FROM onboarding WHERE `date` BETWEEN ? AND ? ",
                new Object[] { java.sql.Date.valueOf(startDate), java.sql.Date.valueOf(endDate) },
                new RowMapper<Onboarding>() {
                    public Onboarding mapRow(ResultSet rs, int rowNum) throws SQLException {
                        Onboarding onboarding = new Onboarding();
                        onboarding.setId(rs.getInt("id"));
                        onboarding.setEmployeeName(rs.getString("employee_name"));
                        onboarding.setDate(rs.getDate("date"));
                        onboarding.setEmail(rs.getString("email")); // 修正setter方法
                        return onboarding;
                    }
                });
        return list;
    }
}

额外优化建议

  • 当前使用的参数占位符?是正确的,能有效避免SQL注入风险,建议保持这种写法。
  • 实体类中date属性使用的java.util.Date是旧版日期类型,Java 8及以上版本推荐使用java.time.LocalDate,配合JPA的@Column(columnDefinition = "DATE")注解,能更好地匹配MySQL的DATE类型,避免不必要的类型转换。

内容的提问来源于stack exchange,提问作者SimpleKarthik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:50:29