使用JPA和Hibernate注册SQL函数

bal*_*teo 5 java spring hibernate sql-function dialect

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

我是否必须通过扩展MysqlInnodb方言或有更好的方法?

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

Vla*_*cea 7

您可能会阅读一些文章,告诉您通过扩展 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
            )
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以通过hibernate.metadata_builder_contributor配置属性传递给 Hibernate :

<property>
    name="hibernate.metadata_builder_contributor" 
    value="com.vladmihalcea.book.hpjp.hibernate.query.function.SqlFunctionsMetadataBuilderContributor"
</property>
Run Code Online (Sandbox Code Playgroud)

或者,如果您在本地引导 Hibernate,则可以将 SQL 函数应用于MetadataBuilder引导期间。


gka*_*mal 6

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

在Dialect类构造函数中添加类似的东西.

registerFunction("current_timestamp", new NoArgSQLFunction(Hibernate.TIMESTAMP) );
registerFunction("date", new StandardSQLFunction(Hibernate.DATE) );
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢!另外:[有趣和相关的链接](http://stackoverflow.com/questions/6113167/hibernate-3-6-registerfunction-in-sql-dialect-not-working) (2认同)