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

jsi*_*ght 13 java sql hibernate hql

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

create or replace function isValidCookie(ckie);
Run Code Online (Sandbox Code Playgroud)

我会从SQL中将其称为:

select * from cookietable c where isValidCookie(c.cookie);
Run Code Online (Sandbox Code Playgroud)

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

Chs*_*y76 13

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

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

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


Tre*_*son 7

从 Hibernate 5 开始,如果您不想依赖或自定义方言,您可以定义一个MetadataBuilderInitializer. 例如,要将 MySQLDATE_ADD与INTERVALfrom HQL一起使用,您可以定义一个名为 的自定义函数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)"));
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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