如果我要在数据库中定义一些函数(可能是Postgres,或任何其他数据库):
create or replace function isValidCookie(ckie);
我会从SQL中将其称为:
select * from cookietable c where isValidCookie(c.cookie);
如何从Hibernate调用这样的自定义函数?
答案 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时,此方法特别有用,其中配置由框架隐式执行。