如果我是在數據庫中(也許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