如何在 JPQL 或 HQL 查询中使用 MySQL CONVERT_TZ 函数
How to use the MySQL CONVERT_TZ function in a JPQL or HQL query
我目前在 MySQL
数据库中有 table,它有一个 startDate
和 endDate
,它们都是 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>
我目前在 MySQL
数据库中有 table,它有一个 startDate
和 endDate
,它们都是 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
:
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>