2009-12-15 53 views
12

如果我是在数据库中(也许Postgres的,或任何其他数据库)来定义一些功能:如何使用Hibernate调用自定义数据库函数?

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

我怎么能调用自定义:

create or replace function isValidCookie(ckie); 

我就从SQL作为叫它像Hibernate这样的函数?

+0

我知道你可以使用与你的表相同的视图(只需在xml中使用mutable),但调用函数将非常方便 – Zoidberg

回答

13

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

来定义它看看PostgreSQLDialect(或任何其他真)来源,你会看到一堆的registerFunction()调用。您需要为自己的自定义功能添加一个:-)。你将不得不在Hibernate配置中指定你自己的方言。

3

您可以使用本机查询来完成此操作。这doc解释。

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

+0

嘿,我需要这个功能来支持Mariadb COLUMN_GET和TIMESTAMPDIFF函数。目前,hibernate尝试将函数参数与查询别名作为前缀。我在哪里必须在Spring Boot中注册这些类? – Pascal