MySQL 的 h2 中的 TIME() 函数和 Java

MySQL's TIME() function in h2 with Java

因此,我需要将以下查询翻译成 Java

SELECT * FROM table WHERE TIME(date) BETWEEN TIME(startTime) AND TIME(endTime)

其中 date 是日期时间列。 startTimeendTime都是局部变量。

我现在使用的技术是 Spring 和 Hibernate。

以下解决方案

query.add(
         Restrictions.sqlRestriction(
             "TIME(date) between TIME('?') and TIME('?')", values, types
     );

,其中 values 变量是 startTimeendTime 的数组,types 变量是 values 各自的数组类型(字符串),不幸的是与 H2 不兼容,因为 TIME 函数没有实现。我确实知道 HOURMINUTESECOND 函数已实现并正常工作。

我自己还没想出实现的方法,网上也没找到解决办法。有谁知道我该如何克服这个问题?

如果你通读了 HQL 语言规范,你会发现它基本上没有对 date/time 函数的任何支持。这主要是因为每个数据库都有自己处理日期和时间的方式,所以很少有通用的支持。但是,CAST函数是HQL支持的,前提是底层数据库也支持。从 H2 documentation 中,我们找到这个转换为时间的例子:

CAST(TIMESTAMP '2010-01-01 10:40:00.123456' AS TIME(6))

因此,您可以尝试在 HQL 查询中这样做:

SELECT *
FROM table
WHERE
    CAST(date AS TIME(6)) BETWEEN CAST(startTime AS TIME(6)) AND
                                  CAST(endTime AS TIME(6));