如何在JPQL或HQL查询中使用MySQL CONVERT_TZ函数

时间:2015-07-30 13:59:26

标签: java hibernate timezone timestamp hql

我目前在MySQL数据库中有一个表格,其中startDateendDate都是timestamps。这与使用hibernate的代码相关联。

我可以使用以下HQL

返回这些内容
SELECT startDate, endDate FROM Reservation where id = :id

我要做的是根据给定的时区返回这些日期。我知道MySQL有一个函数CONVERT_TZ可以根据给定的时区返回日期,我想知道HQL是否有类似的功能?

我知道HQL有一个TIMESTAMP_WITH_ZONE函数,但是当我需要指定时区时,它会使用本地时区,可以这样做吗?

1 个答案:

答案 0 :(得分:3)

自Hibernate ORM 5.2.18

正如我在this article中解释的那样,从5.2.18开始,您可以通过MetadataBuilderContributor注册SQL函数:

public class SqlFunctionsMetadataBuilderContributor 
        implements MetadataBuilderContributor {

    @Override
    public void contribute(MetadataBuilder metadataBuilder) {
        metadataBuilder.applySqlFunction(
            "convert_tz", 
            new StandardSQLFunction( "convert_tz", StandardBasicTypes.TIMESTAMP )
        );
    }
}

Ans只通过MetadataBuilderContributor配置属性提供hibernate.metadata_builder_contributor

<property>
    name="hibernate.metadata_builder_contributor" 
    value="com.vladmihalcea.book.hpjp.hibernate.query.function.SqlFunctionsMetadataBuilderContributor"
</property>

在Hibernate ORM 5.2.18之前

或者,如果您使用Hibernate本机机制进行引导,则可以在构造MetadataBuilder时注册该函数,如Hibernate User Guide中所述。

注册SQL函数的一种非常常见但又天真的方法是覆盖MySQL Dialect并注册新函数,如下所示:

class CustomMySQLDialect extends MySQL5InnoDBDialect {
    public CustomMySQLDialect() {
        super();
        registerFunction( "convert_tz", new StandardSQLFunction( "convert_tz", StandardBasicTypes.TIMESTAMP ) );
    }

}

配置Hibernate使用新方言:

<property>
    name="hibernate.metadata_builder_contributor" 
    value="com.vladmihalcea.book.hpjp.hibernate.CustomMySQLDialect"
</property>