如果我是在数据库中(也许Postgres的,或任何其他数据库)来定义一些功能:如何使用Hibernate调用自定义数据库函数?
select * from cookietable c where isValidCookie(c.cookie);
我怎么能调用自定义:
create or replace function isValidCookie(ckie);
我就从SQL作为叫它像Hibernate这样的函数?
如果我是在数据库中(也许Postgres的,或任何其他数据库)来定义一些功能:如何使用Hibernate调用自定义数据库函数?
select * from cookietable c where isValidCookie(c.cookie);
我怎么能调用自定义:
create or replace function isValidCookie(ckie);
我就从SQL作为叫它像Hibernate这样的函数?
如果你想使用HQL您的自定义功能,你需要在适当的Dialect
来定义它看看PostgreSQLDialect(或任何其他真)来源,你会看到一堆的registerFunction()调用。您需要为自己的自定义功能添加一个:-)。你将不得不在Hibernate配置中指定你自己的方言。
您可以使用本机查询来完成此操作。这doc解释。
从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时,此方法特别有用,其中配置由框架隐式执行。
嘿,我需要这个功能来支持Mariadb COLUMN_GET和TIMESTAMPDIFF函数。目前,hibernate尝试将函数参数与查询别名作为前缀。我在哪里必须在Spring Boot中注册这些类? – Pascal
我知道你可以使用与你的表相同的视图(只需在xml中使用mutable),但调用函数将非常方便 – Zoidberg