Как вы можете вызывать пользовательские функции базы данных с Hibernate? - PullRequest
12 голосов
/ 15 декабря 2009

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

create or replace function isValidCookie(ckie);

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

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

Как я могу вызвать такую ​​функцию из Hibernate?

Ответы [ 3 ]

13 голосов
/ 15 декабря 2009

Если вы хотите использовать свою пользовательскую функцию в HQL, вам нужно определить ее соответствующим образом Диалект

Взгляните на PostgreSQLDialect (или любой другой, действительно) источник, и вы увидите кучу registerFunction () вызовов. Вам нужно будет добавить еще одну :-) - для вашей собственной пользовательской функции.

Затем вам нужно будет указать свой собственный диалект в конфигурации Hibernate.

3 голосов
/ 29 декабря 2016

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

3 голосов
/ 15 декабря 2009

Вы можете сделать это, используя собственные запросы. Это документ объясняет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...