Java JPA Criteria查询使用DATEDIFF遇参数类型错误,求解决方案
解决H2数据库中CriteriaBuilder调用DATEDIFF传递NANOSECOND参数的问题
问题原因
你之前的代码用cb.literal("NANOSECOND")传递字符串字面量,JPA会将其识别为Object类型,但H2的DATEDIFF函数第一个参数需要合法的时间单位标识(支持字符串或TemporalUnit枚举),类型不匹配导致报错。
解决方案
方案1:传递ChronoUnit.NANOSECOND枚举
直接使用java.time.temporal.ChronoUnit枚举中的NANOSECOND作为字面量参数,JPA会自动将其转换为H2能识别的字符串形式:
import java.time.temporal.ChronoUnit; import java.math.BigInteger; // ... var dateDiff = cb.function("DATEDIFF", BigInteger.class, cb.literal(ChronoUnit.NANOSECOND), cb.parameter(OffsetDateTime.class, "startTime"), eventViewEnt.get(EventViewEntity_.timestamp));
方案2:显式指定字符串字面量的类型
如果枚举方式不生效,可以显式指定字面量的类型为String,让JPA正确识别参数类型:
var dateDiff = cb.function("DATEDIFF", BigInteger.class, cb.literal(String.class, "NANOSECOND"), cb.parameter(OffsetDateTime.class, "startTime"), eventViewEnt.get(EventViewEntity_.timestamp));
补充说明
H2的DATEDIFF函数本身支持接受字符串形式的时间单位(如'NANOSECOND'),上述两种方案都是让第一个参数被识别为合法的时间单位标识,而非泛型Object,以此解决类型不匹配问题。
内容的提问来源于stack exchange,提问作者diet coke
相关产品推荐
相关产品推荐

