使用JPQL BETWEEN子句与日期的合适方法

时间:2016-05-02 14:37:05

标签: date jpa jpql

在JPQL中截断日期有什么好方法吗?例如,我有一个列,其中我写了当前日期(新的Date()),然后我需要使用BETWEEN运算符搜索此列。这里的问题是我需要将日期参数配置为开始和结束日期,例如:2016-05-02 00:00:00和2016-05-02-23:59:59。我确实有实用方法来做到这一点,但我想知道是否有其他好的选择。

1 个答案:

答案 0 :(得分:1)

不幸的是,DATE_TRUNC不是JPQL中定义的函数,因此,没有JPA实现(例如Hibernate)支持该功能。

但是,可以在各种JPA实现中将

DATE_TRUNC注册为自定义函数。

例如,对于Hibernate:

public class DateTruncMetadataBuilderInitializer
        implements MetadataBuilderInitializer {
    @Override
    public void contribute(MetadataBuilder metadataBuilder,
            StandardServiceRegistry serviceRegistry) {
        metadataBuilder.applySqlFunction("DATE_TRUNC",
            new SQLFunctionTemplate(DateType.INSTANCE,
                "DATE_TRUNC(?1, ?2)"));
    }
}

然后,您需要在名为META-INF/services/org.hibernate.boot.spi.MetadataBuilderInitializer的JAR资源文件中注册此类。

更改后,您可以在JPQL / HQL查询中使用DATE_TRUNC,如下所示:

SELECT a FROM Entity a 
    WHERE a.dateField BETWEEN DATE_TRUNC('day', :start) AND DATE_TRUNC('day', :end)