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

