使用 JPA 和 Hibernate 注册 SQL 函数

Posted

技术标签:

【中文标题】使用 JPA 和 Hibernate 注册 SQL 函数【英文标题】:Registering a SQL function with JPA and Hibernate 【发布时间】:2012-09-03 00:48:37 【问题描述】:

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

我必须通过扩展 mysqlInnodb 方言还是有更好的方法?

谁能提供代码示例和相关文档的指针?

【问题讨论】:

此方法在 SQL Server 自定义方言中不起作用。提出问题***.com/questions/64905785/… 【参考方案1】:

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

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

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

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

【讨论】:

我必须创建一个新类并扩展现有的方言还是有其他更简单的方法? 是的,创建一个扩展现有方言类的新类。使用你的类作为休眠配置中的方言类。 谢谢!另外:Interesting and relevant link【参考方案2】:

您可能会阅读文章告诉您通过扩展 Hibernate Dialect 来注册 SQL 函数,但这是一个幼稚的解决方案。

从 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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于使用 JPA 和 Hibernate 注册 SQL 函数的主要内容,如果未能解决你的问题,请参考以下文章

Spring 3.1 + Hibernate 4.1 JPA,Entity manager factory注册两次

Hibernate + JPA + jTDS + SQL Server = Unicode 问题

如何在 JPA/Hibernate 中执行本机 SQL 脚本?

SpringBoot JPA打印JPA执行的SQL语句与参数Springboot JPA日志输出打印SQL语句和传入的参数 高阶篇

JPA,Hibernate和Spring Data:在MS SQL服务器上的where子句中将字符串转换为数字

JPA hibernate spring repository pgsql java 工程:sql文件导入数据,测试数据