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

我目前在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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值