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

HQL报错期望java.time.Duration,但方法参数为LocalDateTime

Hibernate 6 JPQL日期运算参数类型不匹配问题

问题现象

在JpaRepository中编写JPQL查询,接收一个String和3个LocalDateTime参数,应用启动正常,但调用查询时抛出类型不匹配错误:

Argument [2023-01-23T11:43:59] of type [java.time.LocalDateTime] did not match parameter type [java.time.Duration (n/a)]

参数已被RestController正确解析,但Hibernate生成查询时出现异常。

相关代码

Repository代码

public interface ExchangePairRepository extends JpaRepository<MyEntity, Long> {

@Query("SELECT ep.unit FROM MyEntity ep WHERE ep.id= :id AND ((ep.context = 'start' AND ((ep.unit = 'day' AND (:start+ ep.duration day) > :now) "
        + "OR (ep.unit = 'month' AND (:start+ ep.duration month) > :now))) OR (ep.context = 'end' AND ((ep.unit = 'day' AND (:now + ep.duration day) > :end) "
        + "OR (ep.unit = 'month' AND (:now + ep.duration month) > :end)) ))")
List<String> findViable(@Param("matNrOrig") String id, @Param("start") LocalDateTime start, @Param("end") LocalDateTime end,
        @Param("now") LocalDateTime now);
}

实体类代码

@Entity
@Table(name = "my_entity")
@Data
public class MyEntity{
    (...)

@Column(name = "id_orig")
private String idOrig;

@Column(name = "id_target")
private String idTarget;

@Column(name = "context")
private String context;

@Column(name = "duration")
private int duration;

@Column(name = "unit")
private String unit;
}

使用环境:Hibernate 6.1.6.Final、Spring Boot 3.0.1、Java 17。

问题分析与结论

这是Hibernate 6的语法解析Bug,并非操作错误。Hibernate 6在处理JPQL中LocalDateTime + 数字 + 时间单位这类运算表达式时,错误地将LocalDateTime参数识别为Duration类型,导致参数类型不匹配。

临时解决方案

你提到的在查询中转换参数的方式是可行的临时方案,通过显式转换明确参数类型,可避免Hibernate的语法解析错误。该Bug会在后续Hibernate版本中修复。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 11:46:02