Подтвердить что ты не робот

Как вы можете вызвать пользовательские функции базы данных с помощью Hibernate?

Если бы я должен был определить некоторую функцию в базе данных (возможно, Postgres или любую другую базу данных):

create or replace function isValidCookie(ckie);

Я бы назвал это из SQL как:

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

Как я могу вызвать пользовательскую функцию, например, из Hibernate?

4b9b3361

Ответ 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, где конфигурация выполняется неявно с помощью фреймворка.