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

Spring Boot+Hibernate中SqmLiteral转SqmExtractUnit报错原因咨询

错误原因分析

这个ClassCastException的核心原因是你传递给EXTRACT函数的第一个参数类型不匹配:

  • Hibernate在处理EXTRACT函数时,要求第一个参数必须是SqmExtractUnit类型的表达式,这是Hibernate内部用来表示时间提取单位的专用类型。
  • 你代码里用builder.literal(ChronoUnit.HOURS)传入的是普通的SqmLiteral对象,Hibernate尝试将其强制转换为SqmExtractUnit时触发了类型转换异常。

另外你代码里还有个小语法错误:ChronoUnit.HOURS;多了一个分号,不过这不是导致当前异常的直接原因。

正确写法示例

你应该用CriteriaBuilder提供的extract方法来实现提取小时的逻辑,而非手动调用builder.function("EXTRACT"):

Expression<Integer> extractHourFunction = builder.extract(
    ChronoUnit.HOURS,
    root.get(entityType.getSingularAttribute("meetingTime", OffsetDateTime.class))
);

如果一定要用builder.function的方式,需要将提取单位指定为符合PostgreSQL语法的字符串字面量:

Expression<Integer> extractHourFunction = builder.function(
    "EXTRACT",
    Integer.class,
    builder.literal("HOUR"),
    root.get(entityType.getSingularAttribute("meetingTime", OffsetDateTime.class))
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 18:23:10