gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:42:23 25 4
gpt4 key购买 nike

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

我可以使用以下 HQL 返回这些

SELECT startDate, endDate FROM Reservation where id = :id

我想做的是根据给定的时区返回这些日期。我知道 MySQL 有一个函数 CONVERT_TZ 可以根据给定的时区返回日期,我想知道 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 )
);
}
}

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 native 机制进行引导,则可以在构造 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>

关于java - 如何在 JPQL 或 HQL 查询中使用 MySQL CONVERT_TZ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31725820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com