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

时间:2009-12-15 18:13:30

标签: java sql hibernate hql

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

create or replace function isValidCookie(ckie);

我会从SQL中将其称为:

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

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

3 个答案:

答案 0 :(得分:13)

如果您想在HQL中使用自定义功能,则需要在适当的Dialect中定义

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

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

答案 1 :(得分:3)

您可以使用本机查询来执行此操作。这个doc解释了。

答案 2 :(得分:3)

从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时,此方法特别有用,其中配置由框架隐式执行。