Регистрация функции SQL с помощью JPA и Hibernate

Я хотел бы знать, как лучше всего зарегистрировать пользовательскую функцию SQL с помощью JPA/Hibernate.

Нужно ли мне расширять диалект MysqlInnodb или есть лучший способ?

Может ли кто-нибудь предоставить образцы кода и указатели на соответствующую документацию?


person balteo    schedule 10.09.2012    source источник
comment
Этот метод не работает на пользовательском диалекте SQL-сервера. Задал вопрос stackoverflow.com/questions/64905785/   -  person pj2494    schedule 23.11.2020


Ответы (3)


Да, расширение диалекта — это хороший способ зарегистрировать пользовательскую функцию SQL.

Добавьте что-то подобное в свой конструктор классов диалекта.

registerFunction("current_timestamp", new NoArgSQLFunction(Hibernate.TIMESTAMP) );
registerFunction("date", new StandardSQLFunction(Hibernate.DATE) );

Посмотрите на исходный код одного из существующих диалектных классов. https://web.archive.org/web/20120923033430/http://www.koders.com/java/fid0E7F787E2EC52F1DA8DFD264EDFBD2DE904A0927.aspx

person gkamal    schedule 10.09.2012
comment
Должен ли я создавать новый класс и расширять существующий диалект или есть другой более простой способ? - person balteo; 10.09.2012
comment
Да, создайте новый класс, расширяющий существующий диалектный класс. Используйте свой класс в качестве класса диалекта в конфигурации гибернации. - person gkamal; 10.09.2012
comment
Спасибо! Также: интересная и актуальная ссылка - person balteo; 10.09.2012

Вы можете читать статьи, в которых вам предлагается зарегистрировать функцию SQL, расширив Hibernate Dialect, но это наивное решение.

Начиная с Hibernate ORM 5.2.18 и 5.3.1, лучший способ зарегистрировать функцию SQL — предоставить MetadataBuilderContributor следующим образом:

public class SqlFunctionsMetadataBuilderContributor 
        implements MetadataBuilderContributor {
         
    @Override
    public void contribute(MetadataBuilder metadataBuilder) {
        metadataBuilder.applySqlFunction(
            "group_concat",
            new StandardSQLFunction(
                "group_concat", 
                StandardBasicTypes.STRING
            )
        );
    }
}

Который вы можете передать в Hibernate через свойство конфигурации hibernate.metadata_builder_contributor:

<property>
    name="hibernate.metadata_builder_contributor" 
    value="com.vladmihalcea.book.hpjp.hibernate.query.function.SqlFunctionsMetadataBuilderContributor"
</property>

Или, если вы загружаете Hibernate изначально, вы можете просто применить функцию SQL к MetadataBuilder во время загрузки.

person Vlad Mihalcea    schedule 11.07.2018

Зарегистрируйте метод SQL для каждой версии

        //Add Hibernate Properties
        properties.put("hibernate.dialect",
                        "com.sparkslink.web.config.sql.RegisterSqlFunction");

        //Create A Class 
        public class RegisterSqlFunction extends MySQLDialect {

            public RegisterSqlFunction() {
                super();
                registerFunction("group_concat", new StandardSQLFunction("group_concat", StandardBasicTypes.STRING));
            }
        }

        //Dao Method

        public List<Client> getTest() {
                Query query = getSession()
                        .createQuery("SELECT sl.name as name ,group_concat(sl.domain) as domain FROM SlClient sl GROUP BY sl.name");
                query.setResultTransformer(Transformers.aliasToBean(Client.class));
                return query.list();
            }
//DTO Class
    public class Client {
        private String name;
        private String domain;
    //Getter 
    //Setter
    }
person Faiz Akram    schedule 29.09.2018