使用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
相关产品推荐
相关产品推荐

