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

