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

JPA原生SQL查询传入字符串日期参数出现类型匹配错误如何解决

根因分析
  • 数据库中data_ass字段为DATE类型,你方法中传入的inizio、fine参数为String类型,数据库不会自动将字符串隐式转换为日期类型做比较,因此触发operator does not exist: date >= character varying错误。该错误和你用BETWEEN语法还是拆分写>=/<=语法无关,本质是两边数据类型不匹配。
  • 你之前尝试的字符串转日期操作未生效,大概率是没有在SQL层面显式指定转换规则,或是转换格式和传入的字符串格式不匹配。
解决方案

方案1:调整入参类型(最推荐,数据库无关)

直接将方法入参类型从String改为LocalDate(Java 8及以上版本)或java.util.Date类型,JPA会自动完成和数据库DATE类型的映射,无需手动处理转换:

@Query(value="select count(id_ass) from assenza where id_dip=?1 and data_ass between ?2 and ?3", nativeQuery = true)
Integer getAssenzeByid_dipmese(int id_dip, LocalDate inizio, LocalDate fine);

调用该方法前,你只需要把原本的字符串格式日期按规则解析为LocalDate类型传入即可。

方案2:SQL层面显式做类型转换

如果业务要求必须保留入参为String类型,可以在SQL中调用对应数据库的日期转换函数,需注意转换格式要和传入的字符串格式完全匹配:

以PostgreSQL为例(日期格式为yyyy-MM-dd):

@Query(value="select count(id_ass) from assenza where id_dip=?1 and data_ass between to_date(?2,'yyyy-MM-dd') and to_date(?3,'yyyy-MM-dd')", nativeQuery = true)
Integer getAssenzeByid_dipmese(int id_dip, String inizio, String fine);

以MySQL为例(日期格式为yyyy-MM-dd):

@Query(value="select count(id_ass) from assenza where id_dip=?1 and data_ass between str_to_date(?2,'%Y-%m-%d') and str_to_date(?3,'%Y-%m-%d')", nativeQuery = true)
Integer getAssenzeByid_dipmese(int id_dip, String inizio, String fine);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:06:00