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

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

create or replace function isValidCookie(ckie); 

我会从SQL中将其称为:

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

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

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

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

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

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

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