Как вы можете вызвать пользовательские функции базы данных с помощью Hibernate?
Если бы я должен был определить некоторую функцию в базе данных (возможно, Postgres или любую другую базу данных):
create or replace function isValidCookie(ckie);
Я бы назвал это из SQL как:
select * from cookietable c where isValidCookie(c.cookie);
Как я могу вызвать пользовательскую функцию, например, из Hibernate?
Ответы
Ответ 1
Если вы хотите использовать свою пользовательскую функцию в HQL, вам необходимо определить ее в соответствующем Dialect
Посмотрите PostgreSQLDialect (или любой другой, действительно) источник, и вы увидите кучу registerFunction(). Вам нужно будет добавить еще одно:-) - для вашей собственной пользовательской функции.
Затем вам нужно будет указать свой диалект в конфигурации Hibernate.
Ответ 2
Возможно, вы сможете сделать это, используя собственные запросы. Этот doc объясняет.
Ответ 3
Как и в Hibernate 5, если вы не хотите зависеть от диалекта или настраивать его, вы можете определить MetadataBuilderInitializer
. Например, чтобы использовать MySQL DATE_ADD
с INTERVAL
из HQL, вы можете определить пользовательскую функцию с именем 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)"));
}
}
Вам также нужно будет поместить имя класса в файл ресурсов JAR с именем META-INF/services/org.hibernate.boot.spi.MetadataBuilderInitializer
.
Этот подход особенно полезен при использовании Hibernate через инфраструктуру, такую как JPA и/или Spring, где конфигурация выполняется неявно с помощью фреймворка.