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

Spring Data JPA按账单日期查询接口报类型转换错误如何解决

问题解决方案

异常根因

报错的核心原因是Spring MVC无法自动将路径中dd-MM-yyyy格式的字符串转为java.util.Date类型,同时现有各层代码存在多处语法、逻辑错误。

逐层代码修正

1 Controller层(解决参数转换异常)

新增@DateTimeFormat注解显式指定路径变量的日期格式,匹配URL中传入的dd-MM-yyyy规则:

@GetMapping("bills/due/{date}")
public ResponseEntity<List<Bills>> getByDate(@PathVariable("date") 
                                             @DateTimeFormat(pattern = "dd-MM-yyyy") Date date) {
    List<Bills> billsByDate = billService.getbillsByDate(date);
    return ResponseEntity.ok(billsByDate);
}

更推荐使用Java 8+的LocalDate替换Date,可避免Date的线程安全、时区歧义问题,注解格式配置规则完全一致


2 Service层(移除冗余错误逻辑)

原有代码存在两处错误:SimpleDateFormat中mm代表分钟、MM才是月份,且date.toString()的输出格式并不匹配yyyy-mm-dd规则,整段日期转换完全冗余,直接传入参数即可:

@Override
public List<Bills> getbillsByDate(Date date) {
    return billRepo.findByDate(date);
}

3 Repository层(修正日期查询逻辑)

日期类型不能使用LIKE语法做模糊匹配,SELECT查询部分字段也无法直接映射为完整的Bills实体,修正后代码如下:
如果数据库billed_date字段为DATE类型(无时分秒):

public interface BillsRepository extends JpaRepository<Bills, Long> {
    @Query(value = "SELECT * FROM bills WHERE DATE(billed_date) = ?1", nativeQuery = true)
    List<Bills> findByDate(@Param("date") Date date);
}

如果billed_date为DATETIME类型(带时分秒),需要查询当日所有记录:

public interface BillsRepository extends JpaRepository<Bills, Long> {
    @Query(value = "SELECT * FROM bills WHERE billed_date >= ?1 AND billed_date < DATE_ADD(?1, INTERVAL 1 DAY)", nativeQuery = true)
    List<Bills> findByDate(@Param("date") Date date);
}

如果不需要原生SQL,可直接省略@Query注解,仅定义方法List<Bills> findByBilledDate(Date billedDate),JPA会自动生成符合规则的查询语句

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 06:24:07