使用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 }