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

Spring2升Spring3+Java8升Java17后extract()函数参数异常求助

问题分析与解决方案

这个错误的核心是Hibernate处理extract()函数时参数类型不匹配:extract()的第二个参数要求是日期/时间类型(TEMPORAL),但实际传入了java.time.Duration类型的值。你提供的updateSchedulerControl方法本身没有直接问题,问题大概率出在调用该方法时传入的query字符串(JPQL/HQL语句)中。

解决步骤:

  • 定位错误查询:找到调用updateSchedulerControl时传入的JPQL/HQL语句,重点查找使用extract()函数的部分。比如类似这样的错误写法:
    select extract(day from :durationParam) from SchedulerControl
    
    这里如果:durationParam是Duration类型,就会触发报错。
  • 修正extract()的参数用法:
    • extract()的标准用法是extract(时间字段 from 日期时间对象),第二个参数必须是LocalDateTime、Timestamp、Date这类日期时间类型,不能是Duration。
    • 如果你的需求是计算时间间隔(比如两个日期的差值),可以改用数据库对应的函数:比如MySQL用TIMESTAMPDIFF(unit, start, end),PostgreSQL用EXTRACT(unit FROM (end - start)),确保传入的是两个日期时间参数而非Duration。
  • 适配新版本的时间类型处理:
    Spring 3搭配的Hibernate 6+对Java 8+的java.time类型支持更完善,建议你把方法中的Timestamp.valueOf(LocalDateTime.now())直接替换为LocalDateTime.now(),避免不必要的类型转换:
    public static Query updateSchedulerControl(EntityManager em, String query, String podId) { 
        Query q = em.createQuery(query);    
        q.setParameter("podId", podId);     
        q.setParameter("sysDate", LocalDateTime.now()); 
        return q; 
    }
    
    同时确保查询语句中:sysDate的用法符合日期时间类型的操作要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 15:28:13