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

How to use the MySQL CONVERT_TZ function in a JPQL or HQL query

我目前在 MySQL 数据库中有 table,它有一个 startDateendDate,它们都是 timestamps。这链接到使用休眠的代码。

我可以 return 使用以下 HQL

SELECT startDate, endDate FROM Reservation where id = :id

我想做的是 return 这些基于给定时区的日期。我知道 MySQL 有一个函数 CONVERT_TZ 可以 return 基于给定时区的日期,我想知道 HQL 是否有类似的函数?

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

从 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 )
        );
    }
}

答案只需通过 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 之前

或者,如果您 bootstrap 使用 Hibernate 本机机制,您可以在构造 MetadataBuilder 时注册函数,如 Hibernate User Guide.

中所述

注册 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>