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

