我想知道使用 JPA/Hibernate 注册自定义 SQL 函数的最佳方法是什么。
我必须扩展 MysqlInnodb 方言还是有更好的方法?
任何人都可以提供代码示例和相关文档的指针吗?
您可能会读到一些文章,告诉您通过扩展 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
)
);
}
}
您可以通过
hibernate.metadata_builder_contributor
配置属性将其传递给 Hibernate:
<property>
name="hibernate.metadata_builder_contributor"
value="com.vladmihalcea.book.hpjp.hibernate.query.function.SqlFunctionsMetadataBuilderContributor"
</property>
或者,如果您原生引导 Hibernate,则可以在引导期间将 SQL 函数应用于
MetadataBuilder
。
是的,扩展方言是注册自定义 SQL 函数的好方法。
在方言类构造函数中添加类似的内容。
registerFunction("current_timestamp", new NoArgSQLFunction(Hibernate.TIMESTAMP) );
registerFunction("date", new StandardSQLFunction(Hibernate.DATE) );
查看现有方言类之一的源代码。 http://www.koders.com/java/fid0E7F787E2EC52F1DA8DFD264EDFBD2DE904A0927.aspx
每个版本注册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
}
MetadataBuilderContributor
已弃用。但不用担心,您可以同样使用 FunctionContributor
,只有细微的差别。请参阅下面的示例:
public class CustomSqlFunctionContributor implements FunctionContributor {
@Override
public void contributeFunctions(FunctionContributions functionContributions) {
functionContributions.getFunctionRegistry().register(
"group_concat",
new StandardSQLFunction(
"group_concat",
StandardBasicTypes.STRING
)
);
}
}