我目前在MySQL数据库中有一个表,其中的startDate和endDate都是时间戳.这是使用休眠链接到代码的.
我可以使用以下HQL返回这些
SELECT startDate, endDate FROM Reservation where id = :id
我想做的是根据给定的时区返回这些日期.我知道MySQL具有功能CONVERT_TZ,它可以基于给定的时区返回日期,我想知道HQL是否具有类似的功能?
我知道HQL具有TIMESTAMP_WITH_ZONE函数,但是当我需要指定时区时,它使用本地时区,可以这样做吗?
最佳答案
从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只需通过hibernate.metadata_builder_contributor配置属性提供MetadataBuilderContributor:
<property>
name="hibernate.metadata_builder_contributor"
value="com.vladmihalcea.book.hpjp.hibernate.query.function.SqlFunctionsMetadataBuilderContributor"
</property>
Hibernate ORM 5.2.18之前的版本
或者,如果您使用Hibernate本机机制进行引导,则可以按照Hibernate User Guide中的说明在构造MetadataBuilder时注册该功能.
注册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>