2009-12-15 15 views
12

Se dovessi definire una qualche funzione nel database (forse Postgres, o di qualsiasi altro database):Come si possono chiamare funzioni di database personalizzate con Hibernate?

create or replace function isValidCookie(ckie); 

Io lo chiamerei da SQL come:

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

Come posso chiamare un personalizzato funzione come questa da Hibernate?

+0

So che è possibile utilizzare una vista come si farebbe con una tabella (basta usare il mutevole in xml), ma chiamare una funzione sarebbe molto utile – Zoidberg

risposta

13

Se si desidera utilizzare la funzione personalizzata in HQL, è necessario definire in adeguata Dialect

Date un'occhiata a PostgreSQLDialect (o di qualsiasi altra realtà,) fonte, e vedrete un sacco di chiamate registerFunction(). Dovrai aggiungerne un'altra :-) - per la tua funzione personalizzata.

Dovrai quindi specificare il tuo dialetto nella configurazione di Hibernate.

3

Potrebbe essere possibile farlo utilizzando le query native. Questo doc spiega.

3

A partire da Hibernate 5, se non si desidera dipendere o personalizzare il dialetto, è possibile definire uno MetadataBuilderInitializer. Ad esempio, per utilizzare MySQL DATE_ADD con una INTERVAL da HQL, è possibile definire una funzione personalizzata denominata 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)")); 
    } 
} 

Si sarebbe anche bisogno di mettere il nome della classe in un file di risorse JAR chiamato META-INF/services/org.hibernate.boot.spi.MetadataBuilderInitializer.

Questo approccio è particolarmente utile quando si utilizza Hibernate tramite un framework come JPA e/o Spring, in cui la configurazione viene eseguita implicitamente dal framework.

+0

Ehi Ho bisogno esattamente di questa funzione per supportare le funzioni Mariadb COLUMN_GET e TIMESTAMPDIFF. Attualmente l'ibernazione tenta di anteporre i parametri della funzione all'alias della query. Dove devo registrare queste lezioni in Spring Boot? – Pascal

Problemi correlati