如何使用Hibernate调用自定义数据库函数?

2022-09-02 21:31:07

如果我在数据库中定义一些函数(也许是Postgres,或任何其他数据库):

create or replace function isValidCookie(ckie);

我将它从SQL称为:

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

如何从Hibernate调用这样的自定义函数?


答案 1

如果要在 HQL 中使用自定义函数,则需要使用适当的方言定义它

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

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


答案 2

从Hibernate 5开始,如果您不想依赖或自定义方言,则可以定义MetadataBuilderInitializer。例如,要将 MySQL 与 from HQL 结合使用,您可以定义一个名为:DATE_ADDINTERVALdate_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)"));
    }
}

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

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


推荐