2009-12-15 48 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