我目前在一个MySQL数据库中有一个表,它有一个startDate和endDate,两者都是timestamps。这是使用hibernate链接到代码的。
我可以使用以下HQL返回这些
SELECT startDate, endDate FROM Reservation where id = :id我要做的是根据给定的时区返回这些日期。我知道MySQL有一个函数CONVERT_TZ,它可以根据给定的时区返回日期,我想知道HQL是否有类似的函数?
我知道HQL有一个TIMESTAMP_WITH_ZONE函数,但是当我需要指定时区时,它使用的是本地时区,可以这样做吗?
发布于 2015-07-31 08:06:52
自Hibernate ORM 5.2.18以来
从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>冬眠之前的ORM 5.2.18
或者,如果您使用Hibernate本机机制引导,您可以在构造MetadataBuilder时注册函数,如Hibernate用户指南中所解释的那样。
注册SQL函数的一种非常常见但又很幼稚的方法是覆盖MySQL方言并注册新函数,如下所示:
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>https://stackoverflow.com/questions/31725820
复制相似问题