使用 JPA 和 Hibernate 注册 SQL 函数

     2023-02-16     206

关键词:

【中文标题】使用 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 Server 2008

】使用存储过程、JPA和Hibernate持久化到SQLServer2008【英文标题】:PersistingtoSQLServer2008usingstoredprocedures,JPAandHibernate【发布时间】:2009-11-1809:30:57【问题描述】:我们正在实施一个网页来维护组织结构。该结构存储在SQLServer2008中并... 查看详情

使用 Hibernate 和 Spring Data JPA 激活 SQL 语句日志记录

】使用Hibernate和SpringDataJPA激活SQL语句日志记录【英文标题】:ActivateSQLstatementsloggingwithHibernateandSpringDataJPA【发布时间】:2018-06-0703:21:37【问题描述】:我有一个使用Hibernate作为提供者的SpringDataJPA存储库。我想记录SQL语句,但我... 查看详情

java示例代码_使用JPA/Hibernate自动注册实体:未知实体

java示例代码_使用JPA/Hibernate自动注册实体:未知实体 查看详情

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

】Hibernate+JPA+jTDS+SQLServer=Unicode问题【英文标题】:Hibernate+JPA+jTDS+SQLServer=UnicodeProblems【发布时间】:2014-11-0208:49:51【问题描述】:我维护了一个作为Servlet运行的软件,可以使用MySQL、Oracle或SQLServer作为数据库后端-取决于客户想要... 查看详情

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

】Spring3.1+Hibernate4.1JPA,Entitymanagerfactory注册两次【英文标题】:Spring3.1+Hibernate4.1JPA,Entitymanagerfactoryisregisteredtwice【发布时间】:2012-06-0715:19:09【问题描述】:我使用SpringFramework3.1和Hibernate4.1作为JPA提供程序,并且我有一个功能齐... 查看详情

java示例代码_在JPA/Hibernate中使用聚合函数调用SQL查询

java示例代码_在JPA/Hibernate中使用聚合函数调用SQL查询 查看详情

Spring JPA Hibernate 和 AttributeConverter

】SpringJPAHibernate和AttributeConverter【英文标题】:SpringJPAHibernateandAttributeConverter【发布时间】:2015-02-1208:18:27【问题描述】:我有一个小型应用程序(spring4.0、jpa2.1、hibernate5.0.2)并且一直在使用“旧”java.util.Date*类以及java.sql.Date... 查看详情

Hibernate和Spring数据jpa同时使用?

】Hibernate和Spring数据jpa同时使用?【英文标题】:SimultaneoususeofHibernateandSpringdatajpa?【发布时间】:2014-03-0711:03:56【问题描述】:是否可以同时使用SpringDataJPA(由Hibernate作为JPA提供者提供支持)和直接使用Hibernate?问题是当我使... 查看详情

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

】如何在JPA/Hibernate中执行本机SQL脚本?【英文标题】:HowcanIexecuteanativeSQLscriptinJPA/Hibernate?【发布时间】:2012-12-3018:32:55【问题描述】:我有一个带有数据库转储的SQL脚本。如何使用Hibernate的EntityManager执行它?我是这样尝试的:... 查看详情

jpa是啥,和hibernate类似?

jpa是什么,和hibernate类似?1、JPA全称JavaPersistenceAPI.JPA通过JDK5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。JPA的主要目标之一就是提供更加简单的编程模型:在JPA框架下创建实体和创建Java类... 查看详情

如何使用 JPA 和 Hibernate 修复 StaleObjectStateException

】如何使用JPA和Hibernate修复StaleObjectStateException【英文标题】:HowtofixStaleObjectStateExceptionwithJPAandHibernate【发布时间】:2014-10-2106:26:18【问题描述】:控制器逻辑:defupdateObject()Objecto=Object.get(params.idasLong)o.otherObjects.clear()obje 查看详情

如何将继承策略与 JPA 注释和 Hibernate 混合使用?

】如何将继承策略与JPA注释和Hibernate混合使用?【英文标题】:HowtomixinheritancestrategieswithJPAannotationsandHibernate?【发布时间】:2011-04-2407:44:00【问题描述】:根据Hibernate参考文档,在使用Hibernate的XML元数据时应该可以混合不同的继... 查看详情

如何使用 Hibernate 和 JPA 处理填充下拉列表?

】如何使用Hibernate和JPA处理填充下拉列表?【英文标题】:HowtohandlepopulatingdropdownwithHibernateandJPA?【发布时间】:2021-06-0710:18:56【问题描述】:大家好,我正在通过一个简单的项目学习Hibernate和JPA,该项目允许用户编辑MySQL数据库... 查看详情

Hibernate 和 JPA 有啥区别?

】Hibernate和JPA有啥区别?【英文标题】:WhatarethedifferencesbetweenHibernateandJPA?Hibernate和JPA有什么区别?【发布时间】:2011-08-0610:31:51【问题描述】:当我在大学学习网络编程时,他们向我们介绍了休眠。我们使用了一段时间,我什... 查看详情

hibernate/JPA 中的 @PreUpdate 和 @Prepersist(使用会话)

】hibernate/JPA中的@PreUpdate和@Prepersist(使用会话)【英文标题】:@PreUpdateand@Prepersistinhibernate/JPA(usingsession)【发布时间】:2011-05-0704:56:12【问题描述】:我遇到了一个向现有项目添加修复程序的阻止程序。主要问题是我想在POJO中... 查看详情

Spring、Spring Security、JPA、MySQL、Hibernate 配置

】Spring、SpringSecurity、JPA、MySQL、Hibernate配置【英文标题】:Spring,SpringSecurity,JPA,MySQL,HibernateConfiguration【发布时间】:2020-08-0606:22:21【问题描述】:我正在开发一个使用springsecurity、hibernate、JPA、mySQL的项目...我正在尝试让我的注... 查看详情

使用JPA和Hibernate时JOIN和JOIN FETCH有啥区别

】使用JPA和Hibernate时JOIN和JOINFETCH有啥区别【英文标题】:WhatisthedifferencebetweenJOINandJOINFETCHwhenusingJPAandHibernate使用JPA和Hibernate时JOIN和JOINFETCH有什么区别【发布时间】:2013-06-3003:48:19【问题描述】:请帮助我了解在哪里使用常规JOIN... 查看详情

如何使用 JPA 和 Hibernate 设置默认查询超时?

】如何使用JPA和Hibernate设置默认查询超时?【英文标题】:HowtosetadefaultquerytimeoutwithJPAandHibernate?【发布时间】:2011-01-0706:30:28【问题描述】:我正在使用Hibernate对我的数据库进行一些大型查询,但有时会遇到超时。我想避免在每... 查看详情