所以,我需要将以下查询翻译成 Java
SELECT * FROM table WHERE TIME(date) BETWEEN TIME(startTime) AND TIME(endTime)
其中date
是日期时间列。startTime
和endTime
都是局部变量。
我现在使用的技术是Spring和Hibernate。
以下解决方案
query.add(
Restrictions.sqlRestriction(
"TIME(date) between TIME('?') and TIME('?')", values, types
);
,其中values
变量是具有startTime
和endTime
的数组,types
变量是具有values
各自类型(字符串(的数组,不幸的是与H2不兼容,因为没有实现TIME
函数。我确实知道HOUR
,MINUTE
和SECOND
功能已实现并正常工作。
我还没有找到自己实现它的方法,也无法在网上找到任何解决方案。有没有人知道我如何克服这个问题?
如果你通读 HQL 语言规范,你会发现它基本上没有任何对日期/时间函数的支持。 这主要是因为每个数据库都有自己的处理日期和时间的方式,因此几乎没有共同的支持。 但是,HQL 支持CAST
函数,前提是基础数据库也支持它。 从 H2 文档中,我们找到了这个强制转换为时间的示例:
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));