【问题标题】:How can you call custom database functions with Hibernate?如何使用 Hibernate 调用自定义数据库函数?
【发布时间】:2010-12-26 22:18:34
【问题描述】:

如果我要在数据库中定义一些函数(可能是 Postgres 或任何其他数据库):

create or replace function isValidCookie(ckie);

我会从 SQL 中调用它:

select * from cookietable c where isValidCookie(c.cookie);

如何从 Hibernate 中调用诸如此类的自定义函数?

【问题讨论】:

  • 我知道您可以像使用表格一样使用视图(只需在 xml 中使用 mutable),但调用函数会非常方便
  • 您可以使用本机查询来做到这一点。这个doc 解释了。

标签: java sql hibernate hql


【解决方案1】:

从 Hibernate 5 开始,如果您不想依赖或自定义方言,您可以定义一个MetadataBuilderInitializer。例如,要将 MySQL DATE_ADD 与 HQL 中的 INTERVAL 一起使用,您可以定义一个名为 date_add_interval 的自定义函数:

public class DateAddIntervalMetadataBuilderInitializer
        implements MetadataBuilderInitializer {
    @Override
    public void contribute(MetadataBuilder metadataBuilder,
            StandardServiceRegistry serviceRegistry) {
        metadataBuilder.applySqlFunction("date_add_interval",
            new SQLFunctionTemplate(DateType.INSTANCE,
                "DATE_ADD(?1, INTERVAL ?2 ?3)"));
    }
}

您还需要将类的名称放在名为 META-INF/services/org.hibernate.boot.spi.MetadataBuilderInitializer 的 JAR 资源文件中。

当通过 JPA 和/或 Spring 等框架使用 Hibernate 时,这种方法特别有用,其中配置由框架隐式执行。

【讨论】:

  • 嘿,我正是需要这个功能来支持 Mariadb COLUMN_GET 和 TIMESTAMPDIFF 函数。当前,hibernate 尝试使用查询别名作为函数参数的前缀。在 Spring Boot 中我必须在哪里注册这些类?
【解决方案2】:

如果您想在 HQL 中使用自定义函数,您需要在适当的 Dialect 中定义它

查看PostgreSQLDialect(或任何其他,真的)来源,您会看到一堆registerFunction() 调用。您需要再添加一个 :-) - 用于您自己的自定义函数。

然后您必须在 Hibernate 配置中指定您自己的方言。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多