我目前在MySQL
数据库中有一个表格,其中startDate
和endDate
都是timestamps
。这与使用hibernate的代码相关联。
我可以使用以下HQL
返回这些内容SELECT startDate, endDate FROM Reservation where id = :id
我要做的是根据给定的时区返回这些日期。我知道MySQL有一个函数CONVERT_TZ
可以根据给定的时区返回日期,我想知道HQL是否有类似的功能?
我知道HQL有一个TIMESTAMP_WITH_ZONE
函数,但是当我需要指定时区时,它会使用本地时区,可以这样做吗?
答案 0 :(得分:3)
正如我在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本机机制进行引导,则可以在构造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>