使用JPA和Hibernate注册SQL函数

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

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

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

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

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

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

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

正如我在本文中所解释的,自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:

  name="hibernate.metadata_builder_contributor" value="com.vladmihalcea.book.hpjp.hibernate.query.function.SqlFunctionsMetadataBuilderContributor"  

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

您可能会阅读文章,告诉您通过扩展Hibernate Dialect来注册SQL函数,但这是一个天真的解决方案。 有关更多详细信息,请阅读本文 。

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