使用 JPA 和 Hibernate 注册 SQL 函数

问题描述 投票:0回答:4

我想知道使用 JPA/Hibernate 注册自定义 SQL 函数的最佳方法是什么。

我必须扩展 MysqlInnodb 方言还是有更好的方法?

任何人都可以提供代码示例和相关文档的指针吗?

java spring hibernate sql-function dialect
4个回答
16
投票

您可能会读到一些文章,告诉您通过扩展 Hibernate 来注册 SQL 函数

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.metadata_builder_contributor
配置属性将其传递给 Hibernate:

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

或者,如果您原生引导 Hibernate,则可以在引导期间将 SQL 函数应用于

MetadataBuilder


7
投票

是的,扩展方言是注册自定义 SQL 函数的好方法。

在方言类构造函数中添加类似的内容。

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

查看现有方言类之一的源代码。 http://www.koders.com/java/fid0E7F787E2EC52F1DA8DFD264EDFBD2DE904A0927.aspx


2
投票

每个版本注册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
    }

0
投票
自 Hibernate 版本 5.3 起,

MetadataBuilderContributor
已弃用。但不用担心,您可以同样使用
FunctionContributor
,只有细微的差别。请参阅下面的示例:

public class CustomSqlFunctionContributor implements FunctionContributor {

    @Override
    public void contributeFunctions(FunctionContributions functionContributions) {
        functionContributions.getFunctionRegistry().register(
                "group_concat",
            new StandardSQLFunction(
                "group_concat", 
                StandardBasicTypes.STRING
            )
        );
    }

}

© www.soinside.com 2019 - 2024. All rights reserved.