2009-12-15 11 views
12

Si tuviera que definir alguna función en la base de datos (tal vez Postgres, o cualquier otra base de datos):¿Cómo se puede llamar a funciones de bases de datos personalizadas con Hibernate?

create or replace function isValidCookie(ckie); 

lo llamaría de SQL como:

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

¿Cómo puedo llamar una costumbre función como esta de Hibernate?

+0

Sé que puede usar una vista igual que una tabla (simplemente use mutable en el xml), pero llamar a una función sería muy útil – Zoidberg

Respuesta

13

Si desea utilizar la función personalizada en HQL, tendrá que definirlo en su caso Dialect

Tome un vistazo a PostgreSQLDialect (o cualquier otro, en realidad) fuente, y verá un montón de registerFunction() llamadas. Necesitará agregar uno más :-) para su propia función personalizada.

Luego tendrá que especificar su propio dialecto en la configuración de Hibernate.

3

Usted puede hacer eso usando consultas nativas. Esto doc explica.

3

A partir de Hibernate 5, si no desea depender o personalizar el dialecto, puede definir un MetadataBuilderInitializer. Por ejemplo, para usar MySQL con un DATE_ADDINTERVAL de HQL, se puede definir una función personalizada llamada 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)")); 
    } 
} 

También habría que poner el nombre de la clase en un archivo de recursos JAR llamado META-INF/services/org.hibernate.boot.spi.MetadataBuilderInitializer.

Este enfoque es particularmente útil cuando se utiliza Hibernate a través de un marco como JPA y/o Spring, donde la configuración se realiza implícitamente por el marco.

+0

Hola, necesito exactamente esta función para admitir las funciones Mariadb COLUMN_GET y TIMESTAMPDIFF. Actualmente hibernate intenta agregar los parámetros de la función con el alias de consulta. ¿Dónde tengo que registrar estas clases en Spring Boot? – Pascal

Cuestiones relacionadas